如何扩展我的viewmodel子项的验证?

时间:2016-09-23 11:43:44

标签: c# wpf

我的模型类Animal实现INotifyDataErrorInfo以添加验证。我的视图绑定到一个视图模型,其属性SelectedAnimal类型为Animal,如下所示:

查看

<TextBox Text="{Binding SelectedAnimal.Epc, UpdateSourceTrigger=PropertyChanged, 
                   ValidatesOnNotifyDataErrors=True}" />

视图模型

public Animal SelectedAnimal
{
    get
    {
        return _animal;
    }
    set
    {
        Set(() => Animal, ref _animal, value);
    }
}

错误可视化正常工作:

enter image description here

问题

我想在我的viewmodel 中完成的字段EPC中添加额外的验证,而不是Animal类。所以我想添加另一个验证规则(例如,检查EPC是否是唯一的),使用EPC TextBox可视化。

我怎样才能做到这一点?该视图模型规则的验证错误也应显示在EPC TextBox上。

我尝试操作类Animal的验证错误列表但没有成功。

其他信息

validation based on class ValidatableModel

1 个答案:

答案 0 :(得分:1)

这是解决问题的一种方法:

  • 在viewmodel中包含要扩展其验证的属性

    public string Epc
    {
        get
        {
           return _epc;
        }
        set
        {
           Animal.Epc = value;
           Set(() => Epc, ref _epc, value, false);
        }
    }
    
  • 向该属性添加两个自定义验证规则

    [CustomValidation(typeof(ViewModel), "AnimalEpcValidate")]
    [CustomValidation(typeof(ViewModel), "ExtendedEpcValidate")]
    
  • 将您的扩展验证码(不是由Animal本身完成)添加到ExtendedEpcValidate

  • 调用Animal.Epc验证并将结果添加到viewmodel中的Epc验证结果

    public static ValidationResult AnimalEpcValidate(object obj, ValidationContext context)
    {
        var aevm = context.ObjectInstance as ViewModel;
    
        // get errors from Animal validation
        var animalErrors = aevm.Animal.GetErrors("Epc")?.Cast<string>();
    
        // add errors from Animal validation to your Epc validation results
        var error = animalErrors?.Aggregate(string.Empty, (current, animalError) => current + animalError);
    
        // return aggregated errors of Epc property
        return string.IsNullOrEmpty(error)
                   ? ValidationResult.Success
                   : new ValidationResult(error, new List<string> { "Epc" });
    }