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

时间:2013-06-22 20:09:42

标签: wpf validation xaml

WPF验证中,了解以下内容之间的区别:

  

ValidatesOnNotifyDataErrors = True

     

ValidatesOnDataErrors = True

     

NotifyOnValidationError = True

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

2 个答案:

答案 0 :(得分:50)

当您希望XAML绑定控件基于ViewModel / Model中实现的接口验证其输入时,使用

ValidatesOnNotifyDataErrorsValidatesOnDataErrorsValidatesOnNotifyDataErrors该接口为{{3}对于ValidatesOnDataErrors而言,它是INotifyDataErrorInfo 例如,假设你有一个这样的视图模型:

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} /> 现在,如果用户在文本框中输入了20个或更多字符,则会检测到错误。

另一方面,如果希望在绑定验证失败时引发事件,则使用NotifyOnValidationError

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

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

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

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

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

答案 1 :(得分:2)

仅为您的信息:WPF中不使用IDataErrorInfo.Error,它可以返回null或引发NotImplementedException。此属性已在WinForms中使用。

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