ValidatesOnDataError 用于根据您的视图模型验证业务规则,并且仅在绑定成功时才会验证。
ValidatesOnExceptions 需要与 ValidatesOnDataError 一起应用以处理由于数据类型不匹配而导致 wpf 无法执行绑定的情况,假设您要将 TextBox 绑定到视图模型中的 Age(整数)属性
<TextBox Text="{Binding Age, ValidatesOnDataErrors=true, UpdateSourceTrigger=PropertyChanged}" />
如果用户通过键入字母而不是数字作为年龄来输入无效条目,例如 xyz,wpf 数据绑定将默默地忽略该值,因为它无法将 xyz 绑定到 Age,并且除非绑定使用ValidatesOnExceptions修饰,否则绑定错误将丢失
<TextBox Text="{Binding Age, ValidatesOnDataErrors=true, ValidatesOnExceptions="True", UpdateSourceTrigger=PropertyChanged}" />
ValidatesOnException 使用 ExceptionValidationRule 对绑定错误使用默认异常处理,上面的语法是以下的简写形式
<TextBox>
<TextBox.Text>
<Binding Path="Age" UpdateSourceTrigger="PropertyChanged" ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<ExceptionValidationRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
</TextBox>
您可以定义自己的规则来验证用户输入,方法是从 ValidationRule 派生并实现 Validate 方法,在以下示例中为 NumericRule
<TextBox.Text>
<Binding Path="Age" ValidatesOnDataErrors="True">
<Binding.ValidationRules>
<rules:NumericRule />
</Binding.ValidationRules>
</Binding>
</TextBox.Text>
验证规则应该是通用的并且不依赖于业务,因为后者是通过 IDataErrorInfo 和 ValidatesOnDataError 完成的。
与我们的单行绑定语法相比,上面的语法相当混乱,通过将 ValidationRule 实现为附加属性,可以改进语法,您可以在这里查看