C# 仅当启用了控件时才在WPF中运行验证

C# 仅当启用了控件时才在WPF中运行验证,c#,.net,wpf,C#,.net,Wpf,我正在对.NET4.0中的几个WPF控件应用绑定验证。目前,我的控件会变为红色,并在某些验证规则失败时显示一条小警告消息。问题是,即使它们被禁用,它们仍然无法通过各自的验证。这可能会误导最终用户,因此我只希望在启用控件的情况下运行验证。我不确定如何实现这个功能 我通过Binding.ValidationRule进行验证,它通过特定的验证类进行连接 编辑: 显示错误的原因是我的验证检查字段是否为空。加载表单时,字段为空,即使已禁用,也无法通过验证。让我回答我自己的问题: 从我的研究中真的没有办法做

我正在对.NET4.0中的几个WPF控件应用绑定验证。目前,我的控件会变为红色,并在某些验证规则失败时显示一条小警告消息。问题是,即使它们被禁用,它们仍然无法通过各自的验证。这可能会误导最终用户,因此我只希望在启用控件的情况下运行验证。我不确定如何实现这个功能

我通过Binding.ValidationRule进行验证,它通过特定的验证类进行连接

编辑:
显示错误的原因是我的验证检查字段是否为空。加载表单时,字段为空,即使已禁用,也无法通过验证。

让我回答我自己的问题:

从我的研究中真的没有办法做到这一点。禁用控件时不显示验证错误的最佳方法是创建一个validation.ErrorTemplate,该模板在控件验证失败且被禁用时专用。我用这种技术来解决这个问题

大致如下:

<Trigger Property="IsEnabled" Value="false">
                <Setter Property="Validation.ErrorTemplate">
                    <Setter.Value>
                        <ControlTemplate>
                            <DockPanel>
                                <Border BorderBrush="Gray" BorderThickness="0">
                                    <AdornedElementPlaceholder/>
                                </Border>
                            </DockPanel>
                        </ControlTemplate>
                    </Setter.Value>
                </Setter>
            </Trigger>


验证失败且控件被禁用时,将不显示红色错误边框

另一种解决方案是通过
AdorneDeletePlaceholder的
AdorneDelete
属性从装饰元素中提取
IsEnabled
的值。在下面的示例中,我使用
IsEnabled=“{Binding ElementName=customAdorner,Path=AdornedElement.IsEnabled}”
。然后,您可以像正常情况一样触发禁用
IsEnabled

 <Style x:Key="TextBoxValidationStyle" TargetType="{x:Type TextBox}">
    <Setter Property="Validation.ErrorTemplate">
      <Setter.Value>
        <ControlTemplate>
          <DockPanel IsEnabled="{Binding ElementName=customAdorner, Path=AdornedElement.IsEnabled}">
            <AdornedElementPlaceholder x:Name="customAdorner">
              <Border x:Name="Border" BorderThickness="1">
                <Border.Style>
                  <Style TargetType="Border">
                    <Style.Triggers>
                      <Trigger Property="IsEnabled" Value="False">
                        <Setter Property="BorderBrush" Value="Transparent" />
                      </Trigger>
                      <Trigger Property="IsEnabled" Value="True">
                        <Setter Property="BorderBrush" Value="Red" />
                      </Trigger>
                    </Style.Triggers>
                  </Style>
                </Border.Style>
              </Border>
            </AdornedElementPlaceholder>
          </DockPanel>
        </ControlTemplate>
      </Setter.Value>
    </Setter>
  </Style>


这样做的好处是,如果在
ErrorTemplate

中有其他文本块等,那么这种方法可以更容易地在不出错的情况下维护布局,并将数据上下文的一些
bool
属性绑定到控件的
IsEnabled
属性。验证时,请检查此
bool
属性并从
ValidationRule.Validate
返回
ValidationResult.ValidResult
。我认为除了要验证的实际“值”之外,没有直接的机制将参数传递给Validate方法。此外,我需要完全在XAML中完成这项工作,因为在这个项目中有许多控件使用这种特殊的样式。换句话说,这不能涉及验证器。