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

