输入验证-通过 WPF 强制执行复杂的业务数据规则2012-03-27 MSDN Brian NoyesMicrosoft Windows Presentation Foundation (WPF) 具有一个丰富数据绑定系统。除了作为通过 Model-View-ViewModel (MVVM) 模式从支持逻辑和数据对 UI 定义进行松散耦合的关键推动力之外,数据绑定系统还为业务数据验证方案提供强大而灵活的支持。WPF 中的数据绑定机制包括多个选项,可用于在创建可编辑视图时评估输入数据的有效性。此外,通过针对控件的 WPF 模板和样式功能,您可以轻松地自定义向用户指示验证错误的方式。为了支持复杂规则并向用户显示验证错误,通常需要组合使用各种可用的验证机制。即使是看似简单的数据输入形式也可能在业务规则变得复杂时带来验证难题。常用方案涉及单个属性级别的简单规则以及交叉耦合属性,在交叉耦合属性中,一个属性的有效性取决于另一个属性的值。然而,通过 WPF 数据绑定中的验证支持,可以轻松地解决这些难题。在本文中,您将了解如何使用 IDataErrorInfo 接口实现、ValidationRules、BindingGroups、异常以及与验证相关的附加属性和事件来满足数据验证需要。您还将了解如何使用自己的 ErrorTemplates 和 ToolTips 来自定义验证错误的显示。在本文中,我假设您已熟悉 WPF 的基本数据绑定功能。数据验证概述几乎每当您在应用程序中输入或修改数据时,都需要确保数据是有效的,以避免与这些更改的来源(在这种情况下为用户)相去甚远。而且,您需要在用户输入的数据无效时向他们提供清晰指示,还能够向其提供一些有关如何更正数据的指示。只要您知道需使用何种功能以及何时使用,便可通过 WPF 相当轻松地完成这些任务。在使用 WPF 中的数据绑定来呈现业务数据时,通常应使用 Binding 对象在目标控件的单个属性与数据源对象属性之间提供数据管道。若要使验证是相关的,通常需进行 TwoWay 数据绑定 — 这意味着,除了从源属性流向目标属性以进行显示的数据之外,编辑过的数据也会从目标流向源,如图 1 所示。

图 1 TwoWay 数据绑定中的数据流可使用三种机制来确定通过数据绑定控件输入的数据是否有效。图 2 对这些机制进行了总结。图 2 绑定验证机制
验证机制 | 说明 |
异常 | 通过在某个 Binding 对象上设置 ValidatesOnExceptions 属性,如果在尝试对源对象属性设置已修改的值的过程中引发异常,则将为该 Binding 设置验证错误。 |
ValidationRules | Binding 类具有一个用于提供 ValidationRule 派生类实例的集合的属性。这些 ValidationRules 需要覆盖某个 Validate 方法,该方法由 Binding 在每次绑定控件中的数据发生更改时进行调用。如果 Validate 方法返回无效的 ValidationResult 对象,则将为该 Binding 设置验证错误。 |
IDataErrorInfo | 通过在绑定数据源对象上实现 IDataErrorInfo 接口并在 Binding 对象上设置 ValidatesOnDataErrors 属性,Binding 将调用从绑定数据源对象公开的 IDataErrorInfo API。如果从这些属性调用返回非 null 或非空字符串,则将为该 Binding 设置验证错误。 |