You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF中Validation.ErrorTemplate的DataTrigger不生效,如何实现TextBox错误警告边框?

问题分析与解决方案

原代码存在的问题

  1. 语法错误:AdornedElementPlaceholder的Name属性引号未闭合,<Setter>标签未正确闭合,导致XAML解析失败。
  2. 模板结构错误:Border被放在AdornedElementPlaceholder内部,这会导致边框无法正确覆盖TextBox——AdornedElementPlaceholder的作用是占位显示原控件,正确的做法是用Border包裹它。
  3. 绑定路径错误:AdornedElementPlaceholder的DataContext并非原TextBox控件,直接通过ElementName绑定其Validation.Errors无法获取正确值,需要绑定到它的AdornedElement属性(指向原控件)。
  4. 样式缺少目标类型:未指定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}"/>

额外优化建议

  • 统一颜色资源:将错误/警告颜色提取为全局资源,方便后续维护:
    <SolidColorBrush x:Key="ValidationErrorBrush" Color="Red"/>
    <SolidColorBrush x:Key="ValidationWarningBrush" Color="Green"/>
    
    然后在Style中替换为BorderBrush="{StaticResource ValidationErrorBrush}"。
  • 多错误处理:如果存在多个验证错误,(Validation.Errors)[0]仅取第一个,若需判断是否存在任意警告,可使用转换器遍历Validation.Errors集合。
  • 属性变更通知:确保你的ErrorContent自定义类实现INotifyPropertyChanged接口,当IsWarning属性变化时能触发UI更新。

内容的提问来源于stack exchange,提问作者Richard Desouza

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.08.03 13:20:32