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

ControlTemplate内数据绑定异常:TextBox禁用时错误文本未隐藏

问题:TextBox禁用时验证错误文本块未隐藏

自定义ControlTemplate作为验证错误模板,尝试用内置的BooleanToVisibilityConverter在被装饰的TextBox禁用时隐藏错误文本块,但TextBox禁用时文本块并未隐藏。

原XAML代码:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="b2v"/>
    <ControlTemplate x:Key="ValidationTemplate">
        <DockPanel>
            <TextBlock Name="ErrorText" FontStyle="Italic" DockPanel.Dock="Bottom" Foreground="red" Text="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                       Visibility="{Binding ElementName=ErrorAdorner, Path=IsEnabled, Converter={StaticResource b2v}, Mode=OneWay}"/>
            <AdornedElementPlaceholder Name="ErrorAdorner"/>
        </DockPanel>
    </ControlTemplate>
</Window.Resources>

问题原因

绑定的是AdornedElementPlaceholder自身的IsEnabled属性,但该控件的IsEnabled状态不会同步被装饰元素(TextBox)的禁用状态,导致绑定失效。

解决方案

修改Visibility的绑定路径,直接指向被装饰元素的IsEnabled属性:

<Window.Resources>
    <BooleanToVisibilityConverter x:Key="b2v"/>
    <ControlTemplate x:Key="ValidationTemplate">
        <DockPanel>
            <TextBlock Name="ErrorText" FontStyle="Italic" DockPanel.Dock="Bottom" Foreground="red" 
                       Text="{Binding ElementName=ErrorAdorner, Path=AdornedElement.(Validation.Errors)[0].ErrorContent}"
                       Visibility="{Binding ElementName=ErrorAdorner, Path=AdornedElement.IsEnabled, Converter={StaticResource b2v}, Mode=OneWay}"/>
            <AdornedElementPlaceholder Name="ErrorAdorner"/>
        </DockPanel>
    </ControlTemplate>
</Window.Resources>

补充说明

BooleanToVisibilityConverter默认逻辑是:true对应Visibility.Visible,false对应Visibility.Collapsed,刚好匹配“TextBox启用时显示错误文本,禁用时隐藏”的需求,无需额外参数。如果需要反向逻辑,可添加ConverterParameter=Reverse。

内容的提问来源于stack exchange,提问作者Tian W.

相关产品推荐
方舟 Agent Plan

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

最近更新时间:2026.07.13 21:15:20