如何使用IDataErrorInfo和数据注释进行简单验证

时间:2018-11-29 14:14:15

标签: c# wpf validation

我有一个拥有Model的房产。该Model继承自实现INotifyPropertyChangedIDataInfoError的基本模型。 在我的财产上方,我有ValidationAttribute必填项,并且有一条错误消息我想带入工具提示中。 因此,我的视图中有一个文本框。

我的建议:当文本框为空时,验证有效。文本框带有红色边框。 当文本框为空并在其中写一些东西时,我的输出窗口会出现错误。

  

System.Windows.Data错误:17:无法从“(Validation.Errors)”(类型“ ReadOnlyObservableCollection`1”)获取“ Item []”值(类型“ ValidationError”)。 BindingExpression:Path =(0)[0] .ErrorContent; DataItem ='TextBox'(Name ='');目标元素是'TextBox'(Name ='');目标属性为“工具提示”(类型为“对象”)ArgumentOutOfRangeException:'System.ArgumentOutOfRangeException:指定的参数不在有效值范围内。   参数名称:index'

要重现该错误: 模型

public class ModelBase : INotifyPropertyChanged, IDataErrorInfo
{
    public event PropertyChangedEventHandler PropertyChanged;

    public void OnPropertyChanged([CallerMemberName] string propertyName = "")
    {
        PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName));
    }

    public string Error { get { return null; } }

    public string this[string columnName]
    {
        get
        {
            var validationResults = new List<ValidationResult>();

            if (Validator.TryValidateProperty(
                    GetType().GetProperty(columnName).GetValue(this)
                    , new ValidationContext(this) { MemberName = columnName }
                    , validationResults))
                return null;

            return validationResults.First().ErrorMessage;
        }
    }
}

public class Model : ModelBase
{
    private string name;

    [Required(ErrorMessage = "Wrong")]
    public string Name
    {
        get { return name; }
        set
        {
            name = value;

            OnPropertyChanged();
        }
    }
}

查看

<Window.Resources>
    <Style TargetType="{x:Type TextBox}">
        <Style.Triggers>
            <Trigger Property="Validation.HasError" Value="True">
                <Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                    Path=(Validation.Errors)[0].ErrorContent}" />
            </Trigger>
        </Style.Triggers>
    </Style>
</Window.Resources>
<StackPanel>
    <TextBox Margin="10" Text="{Binding Name, UpdateSourceTrigger=PropertyChanged, ValidatesOnDataErrors=True, NotifyOnValidationError=True, Mode=TwoWay}"></TextBox>
</StackPanel>

1 个答案:

答案 0 :(得分:1)

当索引器返回ValidationError时,位置0处没有null。绑定到(Validation.Errors).CurrentItem.ErrorContent而不是(Validation.Errors)[0].ErrorContent应该可以解决绑定错误:

<Setter Property="ToolTip" Value="{Binding RelativeSource={RelativeSource Self},
                    Path=(Validation.Errors).CurrentItem.ErrorContent}" />