WPF验证中ValidatesOnNotifyDataErrors和ValidatesOnDataErrors与NotifyOnValidationError有什么区别?

kuh*_*yan 48 validation wpf xaml

WPF验证中,有以下几点之间的区别:

ValidatesOnNotifyDataErrors = True

ValidatesOnDataErrors = True

NotifyOnValidationError = True

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

Ibr*_*jar 53

ValidatesOnNotifyDataErrorsValidatesOnDataErrors当你想要一个XAML绑定控件基于视图模型/型号实现的接口来验证它的输入,使用ValidatesOnNotifyDataErrors该接口是INotifyDataErrorInfoValidatesOnDataErrorsIDataErrorInfo.
例如,假设您有一个这样的视图模型:

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

}
Run Code Online (Sandbox Code Playgroud)

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

另一方面NotifyOnValidationError,当您希望在绑定验证失败时引发事件时使用.

我通常ValidatesOnDataErrors在我的XAML控件中使用进行验证,而我不需要其他两个,所以这取决于你的情况.

编辑:我正在更新我的答案,因为我已经学到了一些新的东西,所以我需要让它更具相关性.

ValidatesOnDataErrors用于胖客户端,或者换句话说,在客户端执行验证时,例如桌面WPF或WinForm应用程序和模型对象实现IDataErrorInfo.

另一方面,ValidatesOnNotifyDataErrors更适合瘦客户端(多层应用程序),例如客户端 - 服务器应用程序(Silverlight,带有WCF的WPF等),其中验证发生在服务器上.

这样,当用户在TextBox中键入某些内容时,该值将异步发送到服务器以进行验证,并且当验证结果返回时会引发事件(确切地说ErrorsChanged事件),然后视图将其选中并显示它使用适当的方法,当然在这种情况下模型将实现INotifyDataErrorInfo.


tho*_*ker 8

仅供您参考:IDataErrorInfo.ErrorWPF 中未使用,可以返回 null 或抛出NotImplementedException.
WinForms 中使用了此属性。

就我个人而言,我更喜欢使用INotifyDataErrorInfo它,因为它允许将多个错误消息映射到单个属性。

  • @冯克尔。要触发验证,必须更新源。因此,验证发生的时间取决于 UpdateSourceTrigger 属性的当前值。因此,将其设置为 PropertyChanged 会使验证在对绑定属性进行任何更改后立即触发。 (2认同)