2013-06-22 43 views

回答

43

ValidatesOnNotifyDataErrorsValidatesOnDataErrors當你想要一個XAML綁定控件基於實現的接口來驗證它的輸入使用在ViewModel/Model中,對於ValidatesOnNotifyDataErrors,該接口爲INotifyDataErrorInfo,對於ValidatesOnDataErrors i t是IDataErrorInfo
例如假設你有一個這樣的視圖模型:

class PersonViewModel : IDataErrorInfo { 

    public string FirstName {get; set;} 

    string IDataErrorInfo.Error 
    { 
     return string.Empty; 
    } 

    string IDataErrorInfo.this[string columnName] { 
     if (columnName == "FirstName" &&) { 
      if (this.FirstName.Length > 20) 
       return "FirstName can't be more than 20 characters."; 

     } 
     return string.Empty; 
    } 

} 

,然後在你看來,你有一個綁定到名字屬性這樣一個文本框:現在 <TextBox Text={Binding Path=FirstName, ValidatesOnDataErrors=True} /> 如果用戶輸入20個字符或更多的文本框中會檢測到錯誤。

另一方面NotifyOnValidationError用於當綁定失敗驗證時想要引發事件。

我通常在我的XAML控件中使用ValidatesOnDataErrors進行驗證,我還沒有其他兩個需要,所以這取決於您的情況。

編輯:我正在更新我的答案,因爲我學到了一些新的東西,所以我需要使這更相關。

ValidatesOnDataErrors在胖客戶端使用,或換言之,當被諸如臺式或WPF WinForm應用程序和模型對象在客戶機側執行的驗證實施IDataErrorInfo

在另一方面,ValidatesOnNotifyDataErrors將是瘦客戶機(多層應用程序)更適合如客戶端 - 服務器應用程序(Silverlight的,WPF與WCF,等等。)在確認發生在服務器上。

這種方式,當在文本框的用戶類型的東西,例如,該值被髮送到服務器異步地進行驗證,並且當驗證結果回來引發事件(事件是精確的),則使用適當的方法查看挑選並顯示它,當然在這種情況下,模型將執行INotifyDataErrorInfo

+1

另一件需要注意的事情是,INotifyDataErrorInfo只能在.NET 4.5中使用,並且...如果你被阻止支持Windows XP(因此你不能使用.NET 4.5),那麼你被卡住了與IDataErrorInfo而不是INotifyDataErrorInfo。 – cplotts