101

我有一个非常简单的 WPF 应用程序,我在其中使用数据绑定来允许编辑一些自定义 CLR 对象。我现在想在用户单击保存时进行一些输入验证。但是,我读过的所有 WPF 书籍并没有真正为这个问题投入任何篇幅。我看到您可以创建自定义 ValidationRules,但我想知道这是否会超出我的需求。

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

4

6 回答 6

83

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

在这里阅读更多

于 2008-09-15T15:09:12.527 回答
24

来自 MS 的Patterns & Practices 文档

数据验证和错误报告

您的视图模型或模型通常需要执行数据验证并向视图发出任何数据验证错误的信号,以便用户可以采取行动纠正它们。

Silverlight 和 WPF 支持管理在更改绑定到视图中控件的单个属性时发生的数据验证错误。对于数据绑定到控件的单个属性,视图模型或模型可以通过拒绝传入的错误值并引发异常来在属性设置器中发出数据验证错误信号。如果数据绑定的 ValidatesOnExceptions 属性为 true,则 WPF 和 Silverlight 中的数据绑定引擎将处理该异常并向用户显示存在数据验证错误的视觉提示。

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

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

于 2010-12-01T16:54:35.020 回答
10

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

  1. 在您的数据绑定表达式中,您需要添加“ValidatesOnException=True”
  2. 在您绑定的数据对象中,您需要添加 DependencyPropertyChanged 处理程序,在其中检查新值是否满足您的条件 - 如果不满足 - 您恢复到对象旧值(如果需要)并抛出异常。
  3. 在您用于在控件中显示无效值的控件模板中,您可以访问错误集合并显示异常消息。

这里的技巧是只绑定到派生自 DependencyObject 的对象。INotifyPropertyChanged 的​​简单实现不起作用 - 框架中有一个错误,它阻止您访问错误集合。

于 2008-09-16T04:07:51.190 回答
3

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

于 2008-09-15T21:55:36.827 回答
2

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

于 2010-07-04T16:38:43.653 回答
0

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

If your business class is a stub class created by a reference to an WCF/XmlWeb service then you can not/must not use IDataErrorInfo nor throw Exception for use with ExceptionValidationRule. Instead you can:

  • Use custom ValidationRule.
  • Define a partial class in your WPF UI project and implements IDataErrorInfo.
于 2012-07-25T08:13:44.380 回答