在另一个控件上显示错误验证

时间:2016-07-28 19:16:13

标签: c# wpf validation xaml inotifydataerrorinfo

我有TextBlockCheckBox,因此:

<StackPanel >
    <TextBlock Text="Colors"/>
    <CheckBox Content="Blue" IsChecked="{Binding Model.Blue, ValidatesOnNotifyDataErrors=False}"/>
</StackPanel>

在我的模型中,我正在实施INotifyDataErrorInfo并验证是否选中了复选框。如果没有检查,我将其视为错误:

public class MyModel : INotifyPropertyChanged, INotifyDataErrorInfo
{
    [CustomValidation(typeof(MyModel), "CheckBoxRequired")]
    public bool Blue
    {
        get { return _blue; }
        set { _blue = value; RaisePropertyChanged(nameof(Blue)); }
    }

    public static ValidationResult CheckBoxRequired(object obj, ValidationContext context)
    {
        var model = (MyModel)context.ObjectInstance;
        if (model.Blue == false)
            return new ValidationResult("Blue required", new string[] { "Blue" });
        else
            return ValidationResult.Success;
    }

    //...
    //INotifyPropertyChanged & INotifyDataErrorInfo implementations omitted
}

ValidatesOnNotifyDataErrors设置为true时,它会在CheckBox周围正确显示一个红色框。它看起来像这样:

enter image description here

我不希望出现红色复选框。为此,我明确将ValidatesOnNotifyDataErrors设置为false。这很好。

出现错误时我想要做的是在TextBlock上显示错误,例如更改TextBlock的字体颜色。 TextBlock如何了解CheckBox上出现的任何错误以及最佳解决方法是什么?

我的预期结果是这样的:

enter image description here

2 个答案:

答案 0 :(得分:3)

首先设置ValidatesOnNotifyDataErrors不是摆脱红色边框的正确方法。这将导致您的数据根本无法验证。你想要的是这个:

<CheckBox Content="Blue" IsChecked="{Binding Model.Blue, ValidatesOnNotifyDataErrors=True}" Validation.ErrorTemplate="{x:Null}"/>

第二,为了获得理想的结果,我会使用this种方法。您可以使用触发器来了解CheckBox中是否存在错误(ErrorsChanged事件,HasError属性在此处应该有用)并设置TextControl的文本颜色。

以下是完成此任务的代码:

<TextBlock Text="Color">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=checkBox, Path=(Validation.HasError)}" Value="True">
                    <Setter Property="Foreground" Value="Red" />
                    <Setter Property="ToolTip" Value="{Binding ElementName=checkBox, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
<CheckBox x:Name="checkBox"
          Margin="4,0"
          Content="Blue"
          IsChecked="{Binding Model.Blue}"
          Validation.ErrorTemplate="{x:Null}" />

答案 1 :(得分:1)

借助Karina K的洞察力,我使用以下代码来达到预期效果:

<TextBlock Text="Color">
    <TextBlock.Style>
        <Style TargetType="TextBlock">
            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=checkBox, Path=(Validation.HasError)}" Value="True">
                    <Setter Property="Foreground" Value="Red" />
                    <Setter Property="ToolTip" Value="{Binding ElementName=checkBox, Path=(Validation.Errors).CurrentItem.ErrorContent}" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
<CheckBox x:Name="checkBox"
          Margin="4,0"
          Content="Blue"
          IsChecked="{Binding Model.Blue}"
          Validation.ErrorTemplate="{x:Null}" />