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

WPF验证模板优化:禁用元素时隐藏错误标记X

解决WPF验证模板在控件禁用时隐藏错误标记的问题

方案一:在ControlTemplate内实现(优先推荐)

直接修改你的ValidationTemplate,给红色"X"的TextBlock添加数据触发器,绑定到被装饰元素的IsEnabled属性,当控件禁用时隐藏错误标记:

<ControlTemplate x:Key="ValidationTemplate">
    <DockPanel>
        <AdornedElementPlaceholder x:Name="AdornedElement"/>
        <TextBlock
            Margin="5,0,0,5"
            VerticalAlignment="Center"
            Text="X"
            FontSize="24"
            FontWeight="Bold"
            Foreground="Red">
            <TextBlock.Style>
                <Style TargetType="TextBlock">
                    <Setter Property="Visibility" Value="Visible"/>
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding ElementName=AdornedElement, Path=AdornedElement.IsEnabled}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
        </TextBlock>
    </DockPanel>
</ControlTemplate>

原理说明

  • 给AdornedElementPlaceholder命名为AdornedElement,通过ElementName绑定它的AdornedElement.IsEnabled属性,这个属性指向当前应用验证模板的控件(比如你的TextBox)。
  • 数据触发器检测到IsEnabled为False时,将TextBlock的Visibility设为Collapsed,彻底隐藏错误标记。

方案二:在TextBox层面处理

如果模板内的实现遇到问题,可以通过TextBox的Style触发器,在控件禁用时替换掉验证模板:

<TextBox
    Width="56"
    Height="27"
    TextAlignment="Right">
    <TextBox.Style>
        <Style TargetType="TextBox">
            <Setter Property="Validation.ErrorTemplate" Value="{StaticResource ValidationTemplate}"/>
            <Style.Triggers>
                <Trigger Property="IsEnabled" Value="False">
                    <Setter Property="Validation.ErrorTemplate" Value="{x:Null}"/>
                </Trigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
    <!-- 原Binding和Behavior代码保持不变 -->
    <Binding
        Converter="{StaticResource DecimalConverter}"
        Path="Length"
        UpdateSourceTrigger="PropertyChanged">
        <Binding.ValidationRules>
            <engine:DecimalValidationRule
                ValidatesOnTargetUpdated="True"
                FieldName="Length"
                Min="0.000"
                Max="100.000" />
        </Binding.ValidationRules>
    </Binding>
    <i:Interaction.Behaviors>
        <engine:TextBoxInputBehavior InputMode="DecimalInput" />
    </i:Interaction.Behaviors>
</TextBox>

原理说明

  • 通过Style的Trigger监听TextBox的IsEnabled属性,当值为False时,将Validation.ErrorTemplate设为{x:Null},这样就不会渲染任何验证装饰器。

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

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.06.18 18:30:15