仅在启用控件时才在WPF中运行验证

时间:2013-06-28 16:33:18

标签: c# .net wpf

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

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

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

2 个答案:

答案 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> 中有其他文本块等,这种方法可以在不出错时更容易维护布局。