WPF数据绑定和validation规则最佳实践

我有一个非常简单的WPF应用程序,我正在使用数据绑定来允许编辑一些自定义的CLR对象。 我现在想在用户点击保存时进行一些inputvalidation。 不过,我所读到的所有WPF书籍都没有给这个问题留下任何空间。 我看到你可以创build自定义的ValidationRules,但我想知道这是否会为我的需要矫枉过正。

所以我的问题是这样的:是否有一个很好的示例应用程序或文章的地方,演示了validationWPF中的用户input的最佳做法?

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

在这里阅读更多

从MS的模式和实践文档 :

数据validation和错误报告

通常需要您的视图模型或模型来执行数据validation,并向视图发送任何数据validation错误,以便用户可以采取行动纠正错误。

Silverlight和WPF为pipe理数据validation错误提供支持,这些错误是在更改绑定到视图中的控件的单个属性时发生的。 对于数据绑定到控件的单个属性,视图模型或模型可以通过拒绝传入的不合格值并抛出exception,在属性设置器中发出数据validation错误。 如果数据绑定上的ValidatesOnExceptions属性为true,则WPF和Silverlight中的数据绑定引擎将处理该exception,并向用户显示一个可视提示,指出存在数据validation错误。

但是,应尽可能避免以这种方式抛出exception。 另一种方法是在视图模型或模型类上实现IDataErrorInfo或INotifyDataErrorInfo接口。 这些接口允许您的视图模型或模型对一个或多个属性值执行数据validation,并将错误消息返回给视图,以便可以通知用户错误。

文档继续解释如何实现IDataErrorInfo和INotifyDataErrorInfo。

个人,我使用exception来处理validation。 它需要以下步骤:

  1. 在你的数据绑定expression式中,你需要添加“ValidatesOnException = True”
  2. 在您绑定的数据对象中,您需要添加DependencyPropertyChanged处理程序,在此处检查新值是否满足您的条件 – 如果不满足,则还原为对象旧值(如果需要)并抛出exception。
  3. 在用于在控件中显示无效值的控件模板中,可以访问错误收集和显示exception消息。

这里的技巧是只绑定到派生自DependencyObject的对象。 INotifyPropertyChanged的简单实现将不起作用 – 框架中存在一个错误,这会阻止您访问错误收集。

另外,Karl Shifflet 为MV-VM写了一篇非常好的inputvalidation文章,您可能也想看看。

另外检查这篇文章 。 据说微软从他们的模式和实践中发布了他们的企业库(v4.0) ,他们涵盖了validation主题,但是上帝知道他们为什么没有包括WPF的validation,所以我正在引导你的博客文章解释了作者做适应它。 希望这可以帮助!

您可能对WPF应用程序框架(WAF)BookLibrary示例应用程序感兴趣。 它演示了如何在WPF中使用validation,以及如何validation错误时如何控制Savebutton。

如果您的业务类直接由您的用户界面使用,最好使用IDataErrorInfo,因为它使逻辑更接近它的所有者。

如果您的业务类是通过对WCF / XmlWeb服务的引用创build的存根类,那么您不能/不得使用IDataErrorInfo,也不要将Exception用于ExceptionValidationRule。 相反,您可以:

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