在WPFvalidation中ValidatesOnNotifyDataErrors和ValidatesOnDataErrors和NotifyOnValidationError有什么区别?

WPFvalidation中 ,以下是什么区别:

ValidatesOnNotifyDataErrors = True

ValidatesOnDataErrors = True

NotifyOnValidationError = True

什么时候应该在XAML中正确使用这些属性?

当您希望XAML绑定控件基于ViewModel / Model中实现的接口validation其input时,使用ValidatesOnNotifyDataErrorsValidatesOnDataErrors ,对于接口为INotifyDataErrorInfoValidatesOnDataErrors和为IDataErrorInfo ValidatesOnDataErrors
例如,假设您有一个像这样的视图模型:

 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; } } 

然后在你的视图中,你有一个绑定到FirstName属性的文本框,如下所示: <TextBox Text={Binding Path=FirstName, ValidatesOnDataErrors=True} />现在,如果用户在文本框中input了20个或更多字符,被检测到。

另一方面,当您想要在绑定失败validation时引发事件时,使用NotifyOnValidationError

我通常在我的XAML控件中使用ValidatesOnDataErrors进行validation,而且我还没有其他两个需要,所以这取决于您的情况。

编辑:我正在更新我的答案,因为我已经学到了一些新的东西,所以我需要使这更相关。

ValidatesOnDataErrors用于胖客户端,换句话说,当在客户端执行validation(如桌面WPF或WinForm应用程序)时,模型对象实现IDataErrorInfo

另一方面, ValidatesOnNotifyDataErrors将更适合于在服务器上进行validation的瘦客户端(多层应用程序),例如客户端 – 服务器应用程序(Silverlight,带有WCF的WPF等)

这样,当用户在TextBox中键入某些东西时,该值将被asynchronous发送到服务器以进行validation,并且当validation结果返回时会引发一个事件( ErrorsChanged事件是确切的) ,然后视图会select并显示它使用适当的方法,当然在这种情况下,模型会实现INotifyDataErrorInfo

我希望它能帮助你:

ValidateOnNotifyDataErrors

ValidateOnDataErrors

NotifyOnValidationError