2017-04-18 61 views
0

在WPF中,典型的驗證實現在屬性值更改時進行驗證。這提出了一個問題。如果您有「必填」字段,並且您單擊某個按鈕,則用戶在點擊按鈕時不會收到空的提醒。由於該值沒有變化,驗證不會發生。何時調用Required.GetBindingExpression驗證企業庫的驗證塊的空字段

有許多方法可以在線執行此驗證,在代碼隱藏,基礎視圖模型等中明確執行驗證。但是,我對Microsoft提出的解決方案感興趣。特別是,這適用於我目前使用的Microsoft企業庫中的驗證應用程序塊。 Microsoft建議的最佳實踐方法,在這裏: https://msdn.microsoft.com/en-us/library/ff664451(v=pandp.50).aspx

特別是他們的狀態:

如果驗證控制攜帶必需的驗證屬性是空的,首先,和驗證過程中保持爲空值,源不會更新並且不會進行驗證。在這種特殊情況下,ValidateOnTargetUpdate屬性不起作用,因爲目標的空默認值不會改變。相反,你可以在綁定調用UpdateSource強制驗證發生,如下所示:

this.Required.GetBindingExpression(TextBox.TextProperty).UpdateSource(); 

的驗證規則在ConvertedProposedValue步驟進行操作,該值已經被轉換之後,但在它被設置來源。這意味着價值轉換錯誤必須通過其他機制來檢測。一種方法是在驗證的綁定上啓用ValidatesOnDataErrors屬性。

不幸的是,我無法理解這一點。我在哪裏調用UpdateSource方法? this在微軟的代碼片段中提及哪個對象?我假設我需要做一些事情,比如攔截某個地方的綁定,但我不確定。

+0

你的'Window'類沒有要求就會有這個功能,所以如果你在'MainWindow.xaml.cs'中輸入它,它會給你'GetBindingExpression'函數。這也可以在任何'Controls'中使用。 – XAMlMAX

回答

0

我想通了。正如評論部分所述,我們可以在窗口或任何控件中訪問GetBindingExpression。我相信微軟的意圖是,Required是一個控件的樣本名稱,而this指的是Window的代碼隱藏或任何其他控件,如Window,它有一個代碼隱藏。

此外,提高其他地方的其他驗證結構提出了PropertyChanged事件(例如,當開發商已經實現IDataErrorInfo的)似乎並不在微軟企業庫的驗證模塊相同的效果。驗證不會通過簡單地在控件上引發PropertyChanged事件而重新發生。這不是特定於必填字段。相反,Microsoft建議在控件上執行UpdateSource,儘管參考了必填字段。

這裏How to invoke UpdateSource for all bindings on the form?是如何在所有元素上實現UpdateSource的示例。