我正在对.NET 4.0中的一些WPF控件应用绑定验证。目前,我的控件变为红色并在它们失败某组ValidationRules时显示一条警告消息。问题是,即使他们被禁用,他们仍然无法通过各自的验证。这可能会误导最终用户,因此我只想在启用控件的情况下运行验证。我不确定如何实现此功能。
我通过Binding.ValidationRule验证,它通过特定的验证类连接。
修改 显示错误的原因是我的验证检查字段是否为空。加载表单时,字段为空并且即使它们被禁用也无法通过验证。
答案 0 :(得分: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>
验证失败并禁用控件时,不会显示红色错误边框。
答案 1 :(得分:0)
另一种解决方案是通过IsEnabled
的{{1}}属性从装饰元素中提取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>
中有其他文本块等,这种方法可以在不出错时更容易维护布局。