3

我正在使用 MVVM 架构开发 WPF 应用程序。我是 WPF 的业余爱好者,所以请耐心等待。

我有两个模型类。父类具有另一个(子)类的对象作为其属性。(我的意思是嵌套对象而不是继承对象)

例如,考虑以下场景。

public class Company
{

   public string CompanyName {get; set;}

   public Employee EmployeeObj {get; set;}
}

public class Employee 
{

   public string FirstName {get; set;}

   public string LastName {get; set;}

}    

我想使用 Enterprise Library Validation Block 来验证 Employee 实体的属性。

我可以通过在员工类中实现 IDataErroInfo 接口来做到这一点,如下所示

public class Employee :  IDataErrorInfo

{

   [NotNullValidator(MessageTemplate="First Name is mandatory"]
   public string FirstName {get; set;}

   [StringLengthValidator(0,20,MessageTemplate="Invalid")]
   public string LastName {get; set;}

   public string Error
   {
        get
        {
            StringBuilder error = new StringBuilder();

            ValidationResults results = Validation.ValidateFromAttributes<Employee>(this);

            foreach (ValidationResult result in results)
            {
                error.AppendLine(result.Message);
            }

            return error.ToString();
        }

    }

    public string this[string propertyName]
    {
        get
        {
            ValidationResults results = Validation.ValidateFromAttributes<Employee>(this);

            foreach (ValidationResult result in results)
            {
                if (result.Key == propertyName)
                {
                    return result.Message;
                }
            }

            return string.Empty;
        }
    }
}

我不想为我创建的每个子模型实现 IDataErroInfo。

有没有办法通过在父(公司)类上实现 IDataErrorInfo 来验证 Employee 对象?

还有任何触发器可以开始验证对象。我只想在我想要的时候而不是一直验证对象。

4

1 回答 1

6

您绝对可以IDataErrorInfo使用验证应用程序块在基类上实现。这是一篇描述如何做的文章。代码基本上归结为:

public abstract class DataErrorInfo : IDataErrorInfo
{
    string IDataErrorInfo.Error
    {
        get { return string.Empty; }
    }

    string IDataErrorInfo.this[string columnName]
    {
        get
        {
            var prop = this.GetType().GetProperty(columnName);
            return this.GetErrorInfo(prop); 
        }
    }

    private string GetErrorInfo(PropertyInfo prop)
    {
        var validator = this.GetPropertyValidator(prop);

        if (validator != null)
        {
           var results = validator.Validate(this);

           if (!results.IsValid)
           {
              return string.Join(" ",
                  results.Select(r => r.Message).ToArray());
           }
        }

        return string.Empty;
    }

    private Validator GetPropertyValidator(PropertyInfo prop)
    {
        string ruleset = string.Empty;
        var source = ValidationSpecificationSource.All;
        var builder = new ReflectionMemberValueAccessBuilder();
        return PropertyValidationFactory.GetPropertyValidator(
            this.GetType(), prop, ruleset, source, builder);
    }
}

您可以使用此抽象类通过继承它为您的实体添加验证行为:

public partial class Customer : DataErrorInfo
{
}
于 2010-11-01T10:28:00.517 回答