2011-01-21 65 views
2

假設您有一個包含20個文本框的窗口,它們都綁定到不同的BLL類。如何在與wpf綁定時攔截從文本框傳遞給屬性的值?我正在尋找一種通用的解決方案,而不是爲每個屬性都這樣做。如何攔截WPF綁定以進行自定義處理

我可以從Binding類繼承,但是在那個類中有一個事件,我可以在數據從uielement傳遞給一個屬性時聽到它?還是有更好的解決方案?

回答

1

我想在所有三個答案投票,但我沒有爲它的聲譽。投票給我,我會投票給你;)

我解決了我的問題,感謝你們!

這裏就是我所做的:

  1. 創建一個新的ValueConverter與事件SourceUpdated,每當值​​傳遞低谷之火。
  2. 繼承我們現有的所有轉換器。
  3. 創建一個新的Binding類(從綁定繼承),在構造函數中看看是否有一個轉換器已經,如果沒有創建一個:

    if (Converter == null) { 
        Converter = new GcBindingConverter(); 
    } 
    
    if (Converter.GetType().IsAssignableFrom(typeof(GcBindingConverter))) { 
        ((GcBindingConverter)Converter).SourceUpdated += SourceUpdatedHandler; 
    } 
    
  4. 在需要此功能,各線形式該事件的事件處理程序,我已經把處理器在我們的ModelState:

    static void WireDirtyBindings(DependencyObject element, ModelStateBase ModelState) 
    { 
        Binding bb = null; 
        // find bindings on elements: 
        if ((object.ReferenceEquals(element.GetType, typeof(TextBox)))) { 
         bb = BindingOperations.GetBinding(element, TextBox.TextProperty); 
        } else if ((object.ReferenceEquals(element.GetType, typeof(ComboBox)))) { 
         bb = BindingOperations.GetBinding(element, ComboBox.SelectedValueProperty); 
         // other objects... 
        } 
    
    
    if (bb != null) { 
        // wire eventhandler to event: 
        doWireHandler(bb, ModelState); 
    } 
    
    // Now, recurse through any child elements 
    if (element is FrameworkElement || element is FrameworkContentElement) { 
        foreach (object childElement in LogicalTreeHelper.GetChildren(element)) { 
         if (childElement is DependencyObject) { 
          WireDirtyBindings((DependencyObject)childElement, ModelState); 
         } 
        } 
    } 
    

    }

我現在已經寫了有大量的數據輸入的各種形式的唯一事情是:

BaseBinding.WireDirtyBindings(this, _modelState); 

5:在形式,結合保存更改按鈕的啓用狀態,說如果ModelState中財產有有任何變化。我也可以爲此使用一個接口,但由於我們已經有了類似於模型狀態的東西,所以這是一個放置它的好地方。

只需幾行代碼就可以很好地工作。現在我不必擔心最終用戶在不保存的情況下進行大量更改。

1

綁定有一個Converter屬性,您可以爲其分配一個實現IValueConverter的類。如果你可以從綁定繼承,也許你可以在該專業化設置轉換器,並繼續。

+0

與mattythomas2000相同的評論:是的,但我已經有很多價值轉換者做各種各樣的東西。通過自定義綁定類設置valueconverter將清除這些。綁定類中沒有簡單的更新事件嗎? – 2011-01-21 14:57:30

+0

在這種情況下,您可能需要設計一個複合IValueConverter ...不知道在合併值修改時你想實現什麼樣的邏輯,但是你可以很容易地擁有一個IValueConverter實現,它可以將幾個值轉換器合併成一個 – flq 2011-01-21 15:07:22

1

我認爲你正在尋找的解決方案是一個價值轉換器。這個msdn頁面描述瞭如何做到這一點 - >http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion

+0

是的,但是我已經有很多價值轉換器可以處理各種各樣的東西。通過自定義綁定類設置valueconverter將清除這些。綁定類中沒有簡單的更新事件嗎? – 2011-01-21 14:52:52