4

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

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

编辑: 显示错误的原因是我的验证检查该字段是否为空。当表单加载时,这些字段是空的并且即使它们被禁用也无法通过验证。

4

2 回答 2

2

让我回答我自己的问题:

从我的研究来看,这真的没有办法。当控件被禁用时不显示验证错误的最佳方法是创建一个 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>

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

于 2013-07-03T16:29:30.297 回答
0

另一种解决方案是IsEnabled通过AdornedElement. AdornedElementPlaceholder在下面的示例中,我使用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.

于 2015-06-29T09:27:12.980 回答