WPF中Validation.ErrorTemplate的DataTrigger不生效,如何实现TextBox错误警告边框?
问题分析与解决方案
原代码存在的问题
- 语法错误:
AdornedElementPlaceholder的Name属性引号未闭合,<Setter>标签未正确闭合,导致XAML解析失败。 - 模板结构错误:
Border被放在AdornedElementPlaceholder内部,这会导致边框无法正确覆盖TextBox——AdornedElementPlaceholder的作用是占位显示原控件,正确的做法是用Border包裹它。 - 绑定路径错误:
AdornedElementPlaceholder的DataContext并非原TextBox控件,直接通过ElementName绑定其Validation.Errors无法获取正确值,需要绑定到它的AdornedElement属性(指向原控件)。 - 样式缺少目标类型:未指定
Style的TargetType,可能导致样式应用异常。
修正后的完整代码
验证样式定义
<Style x:Key="ErrTemplate" TargetType="{x:Type TextBox}"> <Setter Property="Validation.ErrorTemplate"> <Setter.Value> <ControlTemplate> <!-- 用Border包裹占位符,实现边框覆盖TextBox --> <Border x:Name="MainBorder" BorderBrush="Red" BorderThickness="1"> <AdornedElementPlaceholder x:Name="ControlWithErrors" /> </Border> <ControlTemplate.Triggers> <!-- 绑定到原控件的Validation.Errors第一个错误的IsWarning属性 --> <DataTrigger Binding="{Binding ElementName=ControlWithErrors, Path=AdornedElement.(Validation.Errors)[0].ErrorContent.IsWarning}" Value="true"> <Setter TargetName="MainBorder" Property="BorderBrush" Value="Green"/> </DataTrigger> </ControlTemplate.Triggers> </ControlTemplate> </Setter.Value> </Setter> </Style>
TextBox绑定代码
<TextBox x:Uid="EmailName" x:Name="EmailName" Text="{Binding EmailName, Mode=TwoWay, NotifyOnValidationError=True, ValidatesOnNotifyDataErrors=True, UpdateSourceTrigger=PropertyChanged}" Style="{DynamicResource ErrTemplate}"/>
额外优化建议
- 统一颜色资源:将错误/警告颜色提取为全局资源,方便后续维护:
然后在Style中替换为<SolidColorBrush x:Key="ValidationErrorBrush" Color="Red"/> <SolidColorBrush x:Key="ValidationWarningBrush" Color="Green"/>BorderBrush="{StaticResource ValidationErrorBrush}"。 - 多错误处理:如果存在多个验证错误,
(Validation.Errors)[0]仅取第一个,若需判断是否存在任意警告,可使用转换器遍历Validation.Errors集合。 - 属性变更通知:确保你的
ErrorContent自定义类实现INotifyPropertyChanged接口,当IsWarning属性变化时能触发UI更新。
内容的提问来源于stack exchange,提问作者Richard Desouza
相关产品推荐
相关产品推荐

