关于.net:WPF数据绑定和验证规则最佳实践

关于.net:WPF数据绑定和验证规则最佳实践

WPF Data Binding and Validation Rules Best Practices

我有一个非常简单的WPF应用程序,其中使用数据绑定来允许编辑某些自定义CLR对象。 我现在想在用户单击保存时添加一些输入验证。 但是,我读过的所有WPF书籍都没有真正致力于解决这个问题。 我看到您可以创建自定义的ValidationRules,但是我想知道这是否会过分满足我的需求。

所以我的问题是:在某处是否有一个好的示例应用程序或文章展示了验证WPF中用户输入的最佳实践?


我认为新的首选方法可能是使用IDataErrorInfo

在这里阅读更多


从MS的模式和实践文档中:

Data Validation and Error Reporting

Your view model or model will often be
required to perform data validation
and to signal any data validation
errors to the view so that the user
can act to correct them.

Silverlight and WPF provide support
for managing data validation errors
that occur when changing individual
properties that are bound to controls
in the view. For single properties
that are data-bound to a control, the
view model or model can signal a data
validation error within the property
setter by rejecting an incoming bad
value and throwing an exception. If
the ValidatesOnExceptions property on
the data binding is true, the data
binding engine in WPF and Silverlight
will handle the exception and display
a visual cue to the user that there is
a data validation error.

However, throwing exceptions with
properties in this way should be
avoided where possible. An alternative
approach is to implement the
IDataErrorInfo or INotifyDataErrorInfo
interfaces on your view model or model
classes. These interfaces allow your
view model or model to perform data
validation for one or more property
values and to return an error message
to the view so that the user can be
notified of the error.

该文档继续说明了如何实现IDataErrorInfo和INotifyDataErrorInfo。


个人而言,我正在使用异常处理验证。它需要执行以下步骤:

  • 在数据绑定表达式中,您需要添加" ValidatesOnException = True"
  • 在要绑定到的数据对象中,您需要添加DependencyPropertyChanged处理程序,在其中检查新值是否满足条件-如果不满足,则恢复到对象的旧值(如果需要),并引发异常。
  • 在用于在控件中显示无效值的控件模板中,可以访问"错误收集"并显示异常消息。
  • 这里的技巧是仅绑定到从DependencyObject派生的对象。 INotifyPropertyChanged的简单实现不起作用-框架中存在一个错误,该错误阻止您访问错误集合。


    还要检查这篇文章。据说微软从他们的模式和实践中发布了他们的企业库(v4.0),其中涵盖了验证主题,但是上帝知道为什么他们不包括对WPF的验证,因此我将指导您的博客文章解释了作者的内容。做了适应它。希望这可以帮助!


    您可能对WPF应用程序框架(WAF)的BookLibrary示例应用程序感兴趣。它显示了如何在WPF中使用验证以及存在验证错误时如何控制"保存"按钮。


    如果您的UI直接使用您的业务类,则最好使用IDataErrorInfo,因为它使逻辑更接近其所有者。

    如果您的业务类是由对WCF / XmlWeb服务的引用创建的存根类,则您不能/必须不使用IDataErrorInfo或将Exception抛出以与ExceptionValidationRule一起使用。相反,您可以:

    • 使用自定义ValidationRule。
    • 在WPF UI项目中定义一个局部类,并实现IDataErrorInfo。


    推荐阅读