假設您有一個包含20個文本框的窗口,它們都綁定到不同的BLL類。如何在與wpf綁定時攔截從文本框傳遞給屬性的值?我正在尋找一種通用的解決方案,而不是爲每個屬性都這樣做。如何攔截WPF綁定以進行自定義處理
我可以從Binding類繼承,但是在那個類中有一個事件,我可以在數據從uielement傳遞給一個屬性時聽到它?還是有更好的解決方案?
假設您有一個包含20個文本框的窗口,它們都綁定到不同的BLL類。如何在與wpf綁定時攔截從文本框傳遞給屬性的值?我正在尋找一種通用的解決方案,而不是爲每個屬性都這樣做。如何攔截WPF綁定以進行自定義處理
我可以從Binding類繼承,但是在那個類中有一個事件,我可以在數據從uielement傳遞給一個屬性時聽到它?還是有更好的解決方案?
我想在所有三個答案投票,但我沒有爲它的聲譽。投票給我,我會投票給你;)
我解決了我的問題,感謝你們!
這裏就是我所做的:
創建一個新的Binding類(從綁定繼承),在構造函數中看看是否有一個轉換器已經,如果沒有創建一個:
if (Converter == null) {
Converter = new GcBindingConverter();
}
if (Converter.GetType().IsAssignableFrom(typeof(GcBindingConverter))) {
((GcBindingConverter)Converter).SourceUpdated += SourceUpdatedHandler;
}
在需要此功能,各線形式該事件的事件處理程序,我已經把處理器在我們的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中財產有有任何變化。我也可以爲此使用一個接口,但由於我們已經有了類似於模型狀態的東西,所以這是一個放置它的好地方。
只需幾行代碼就可以很好地工作。現在我不必擔心最終用戶在不保存的情況下進行大量更改。
綁定有一個Converter屬性,您可以爲其分配一個實現IValueConverter的類。如果你可以從綁定繼承,也許你可以在該專業化設置轉換器,並繼續。
我認爲你正在尋找的解決方案是一個價值轉換器。這個msdn頁面描述瞭如何做到這一點 - >http://msdn.microsoft.com/en-us/library/ms752347.aspx#data_conversion。
是的,但是我已經有很多價值轉換器可以處理各種各樣的東西。通過自定義綁定類設置valueconverter將清除這些。綁定類中沒有簡單的更新事件嗎? – 2011-01-21 14:52:52
我可能會誤解,但你有沒有嘗試過轉換器?這裏是一個不錯的網站,你可以檢查出來:
http://www.switchonthecode.com/tutorials/wpf-tutorial-binding-converters
與mattythomas2000相同的評論:是的,但我已經有很多價值轉換者做各種各樣的東西。通過自定義綁定類設置valueconverter將清除這些。綁定類中沒有簡單的更新事件嗎? – 2011-01-21 14:57:30
在這種情況下,您可能需要設計一個複合IValueConverter ...不知道在合併值修改時你想實現什麼樣的邏輯,但是你可以很容易地擁有一個IValueConverter實現,它可以將幾個值轉換器合併成一個 – flq 2011-01-21 15:07:22