[WPF] 让第一个数据验证出错(Validation.HasError)的控件自动获得焦点 (2)

在 OnAutoFocusWhenValidationErrorChanged 这个回调函数里面,我们可以拿到被 “附加”的元素 target,以及附加属性的值。如果这个值为 true (在这种用法里通常都是 true,类似一个简单的 Behavior),则通过 Validation.AddErrorHandler 为 target 添加事件处理程序,当数据验证出错时找到表单范围内第一个出错的元素,如果它还没有获得焦点就执行 Focus 函数。

在 XAML 中,为了让表单中所有元素都附加上这个行为,可以通过全局样式:

<StackPanel.Resources> <Style BasedOn="{StaticResource {x:Type TextBox}}" TargetType="TextBox"> <Setter Property="local:ValidationService.AutoFocusWhenValidationError" Value="True" /> </Style> </StackPanel.Resources> 5. 最后

这种做法需要每个数据绑定中的 NotifyOnValidationError 必须设置为 true,在实际业务中比较麻烦。还有一种方法是主动遍历所有元素并使用 Validation.GetHasError 找到目标元素,这样做法简单很多,但不够自动,而且和本文的方法大同小异,就不另外写出来了。

6. 源码

https://github.com/DinoChan/Wpf_Focus_Demo

内容版权声明:除非注明,否则皆为本站原创文章。

转载注明出处:https://www.heiqu.com/wpwgdp.html