WPF验证错误显示

WPF 显示验证错误的默认方式是在控件周围绘制红色边框。通常需要对此方法进行自定义,以通过其他方式来显示错误。而且,默认情况下不会显示与验证错误关联的错误消息。常见的要求是仅当存在验证错误时才在工具提示中显示错误消息。通过将 Styles 和一组与验证关联的附加属性进行组合,可以相当轻松地自定义验证错误显示。

添加显示错误文本的工具提示非常简单。只需定义一个应用于输入控件的 Style,每当存在验证错误时,它便将该控件上的 ToolTip 属性设置为验证错误文本。若要对此提供支持,需要使用两个附加属性:Validation.HasError 和 Validation.Errors。下面演示了一个针对 TextBox 类型并设置工具提示的 Style:

 1 <Style TargetType="TextBox">
 2   <Style.Triggers>
 3     <Trigger Property="Validation.HasError" 
 4              Value="True">
 5       <Setter Property="ToolTip">
 6         <Setter.Value>
 7           <Binding 
 8             Path="(Validation.Errors).CurrentItem.ErrorContent"
 9             RelativeSource="{x:Static RelativeSource.Self}" />
10         </Setter.Value>
11       </Setter>
12     </Trigger>
13   </Style.Triggers>
14 </Style>

您可以看到,Style 只包含 Validation.HasError 附加属性的属性触发器。当 Binding 更新其源对象属性且验证机制生成错误时,HasError 属性会设置为 true。这种情况可能源自异常、ValidationRule 或 IDataErrorInfo 调用。该 Style 随后使用 Validation.Errors 附加属性,该属性会在存在验证错误时包含一个错误字符串集合。可以使用该集合类型的 CurrentItem 属性来仅获取集合中的第一个字符串。也可以设计为将数据绑定到集合,并为面向列表的控件中的每一项显示 ErrorContent 属性。

若要将控件的默认验证错误显示更改为红色边框之外的内容,需要将 Validation.ErrorTemplate 附加属性设置为要自定义的控件上的新模板。在示例应用程序中,将在存在错误的每个控件右侧显示一个小的红色渐变圆形,而不是显示红色边框。为此,可定义用作 ErrorTemplate 的控件模板。

 1 <ControlTemplate x:Key="InputErrorTemplate">
 2   <DockPanel>
 3     <Ellipse DockPanel.Dock="Right" Margin="2,0" 
 4              ToolTip="Contains invalid data"
 5              Width="10" Height="10">
 6       <Ellipse.Fill>
 7         <LinearGradientBrush>
 8           <GradientStop Color="#11FF1111" Offset="0" />
 9           <GradientStop Color="#FFFF0000" Offset="1" />
10         </LinearGradientBrush>
11       </Ellipse.Fill>
12     </Ellipse>
13     <AdornedElementPlaceholder />
14   </DockPanel>
15 </ControlTemplate>

若要将该控件模板挂接到某个控件,只需设置该控件的 Validation.ErrorTemplate 属性,您可以通过 Style 再次执行此操作:

1 <Style TargetType="TextBox">
2   <Setter Property="Validation.ErrorTemplate" 
3     Value="{StaticResource InputErrorTemplate}" />
4   ...
5 </Style>
作者:backslash112 (美国CS研究生在读/机器人工程师)
出处:http://sirkevin.cnblogs.com
GitHub:https://github.com/backslash112
本文版权归作者和博客园共有,欢迎转载,但未经作者同意必须保留此段声明,且在文章页面明显位置给出原文连接,否则保留追究法律责任的权利。
原文地址:https://www.cnblogs.com/sirkevin/p/2609190.html