我有一個WPF應用程序,其中包含約50個控件,這些控件綁定到實現INotifyPropertyChanged的業務對象上的屬性。這裏是我的業務對象的一個快速片段:我也有幾個驗證規則用於驗證這些控件中的用戶輸入。如果有任何驗證錯誤,我使用命令綁定來阻止我的用戶保存數據。我的應用程序還包含一個「重置默認值」按鈕,顯然,它將重置業務對象上所有屬性的默認值。這一切正如我所願,只有一個例外。如果我的用戶將無效數據輸入到一個或多個控件中,然後單擊「重置默認值」按鈕,那麼包含無效數據的控件並不總是按照我的預期更新。發生這種情況是因爲在我的屬性setter以下代碼:強制使用GetBindingExpression()更新所有WPF綁定控件UpdateTarget()
if (_name == value)
{
return;
}
該代碼的存在是爲了防止不必要的屬性從當通過我的用戶在綁定UI控制輸入的值是相同的值,該場所中發生改變的通知已經設置爲。作爲一個例子,我在我的UI中有一個IntegerUpDown控件(這個控件是Xceed的擴展WPF工具包的一部分)。我的控件綁定的屬性的默認值爲10.我的用戶從控件中刪除了該值,並且觸發了驗證規則,導致驗證錯誤,並且使用錯誤裝飾器等適當更新UI。值該控件映射到的屬性沒有被更改,因此它仍然被設置爲10.現在我的用戶單擊「重置默認值」按鈕,這將導致屬性被重置的默認值(10)。但是,該屬性的值爲已經設置爲10,因此設置器中的短路邏輯將返回而不是設置屬性值。
所以,現在,我的用戶點擊後「恢復默認值」,我也迫使更新我的約束性指標是這樣的:
this.myIntegerUpDown.GetBindingExpression(Xceed.Wpf.Toolkit.IntegerUpDown.ValueProperty).UpdateTarget();
這解決了我的問題,但僅適用於這個特定的控制。有沒有簡單的方法來做到這一點所有我的約束控制,而不必指定每一個?謝謝。
爲什麼不直接調用NotifyPropertyChanged(),在復位沒有任何參數,並且強制所有的更新。 50個控件不應該花那麼長時間。 – Paparazzi
@Blam - 也是一個好主意。感謝您的建議。 – user685869