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.
相关产品推荐
相关产品推荐

