Как проверить дочерние объекты путем реализации IDataErrorInfo в родительском классе - PullRequest
3 голосов
/ 23 июля 2010

Я разрабатываю приложение WPF с использованием архитектуры MVVM.Я любитель 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;}

}    

Я хочу проверить свойства объекта Employee с помощью блока валидации Enterprise Library.

Мне удалось это сделать, реализовав интерфейс 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 для каждой создаваемой дочерней модели.

Есть ли способ проверить объект Employee путем реализации IDataErrorInfo в родительском (Company) классе?

А также есть ли триггеры для запуска проверки объектов.Я хотел бы проверять объекты только тогда, когда я хочу, а не постоянно.

1 Ответ

6 голосов
/ 01 ноября 2010

Вы можете абсолютно реализовать 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
{
}
...