C# 仅当启用了控件时才在WPF中运行验证
我正在对.NET4.0中的几个WPF控件应用绑定验证。目前,我的控件会变为红色,并在某些验证规则失败时显示一条小警告消息。问题是,即使它们被禁用,它们仍然无法通过各自的验证。这可能会误导最终用户,因此我只希望在启用控件的情况下运行验证。我不确定如何实现这个功能 我通过Binding.ValidationRule进行验证,它通过特定的验证类进行连接 编辑:C# 仅当启用了控件时才在WPF中运行验证,c#,.net,wpf,C#,.net,Wpf,我正在对.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中完成这项工作,因为在这个项目中有许多控件使用这种特殊的样式。换句话说,这不能涉及验证器。