通常会使用同类规则的每个元素定义不同的验证规则对象。如果确实希望为多个绑定使用相同的验证规则,可将验证规则定义为资源,并在每个绑定中简单的使用静态标记指向该资源。
Binding.ValidationRules集合可包含任意数量的验证规则。将值提交到源时,WPF将按照顺序检查每个验证规则,如果所有规则验证都成功了,WPF接着会调用转化器为源应用值。
响应验证错误
在上述例子中,有关用户接收到错误的唯一指示是在违反规则的文本框周围的红色轮廓。为了提供更多信息,可以处理Error事件,当存储或者清楚错误时会引发该事件,但是前提是首先确保已经将 NotifyOnValidationError="True"。
Error事件使用冒泡策略的路由事件,所以可通过在父容器中关联事件处理程序来为多个控件来处理Error事件。
<TextBox Margin="200,300,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Validation.Error="TextBox_Error"> <TextBox.Text> <Binding NotifyOnValidationError="True" Path="ProductPrice"> <Binding.ValidationRules> <local:CustomValidation MaxValue="99.99" /> </Binding.ValidationRules> </Binding> </TextBox.Text> </TextBox> private void TextBox_Error(object sender, ValidationErrorEventArgs e) { if(e.Action == ValidationErrorEventAction.Added) { MessageBox.Show(e.Error.ErrorContent.ToString()); } }ValidationErrorEventArgs.Error属性提供了一个ValidationError的对象,包含引起问题的异常(Exception),违反的验证规则(ValidationRule),关联的绑定对象(BindingInError)以及ValidationRule对象返回的任何自定义消息(ErrorContent)。
获取错误列表
在某些情况下,可能需要获取当前窗口所有的错误信息,需要做的就是遍历元素树,获取每个元素的属性。
显示不同的错误指示符号
可以通过定义自己的错误模板,以适当的方式来标识错误信息。错位模板是装饰层,始终位于窗口内容之上的绘图层。
<TextBox Margin="200,300,0,0" HorizontalAlignment="Left" VerticalAlignment="Top" Validation.Error="TextBox_Error"> <TextBox.Text> <Binding NotifyOnValidationError="True" Path="ProductPrice"> <Binding.ValidationRules> <local:CustomValidation MaxValue="99.99" /> </Binding.ValidationRules> </Binding> </TextBox.Text> <Validation.ErrorTemplate> <ControlTemplate> <TextBlock Text="***" Foreground="Red"/> </ControlTemplate> </Validation.ErrorTemplate> </TextBox>