2010-07-23 1 views
2

Я разрабатываю приложение WPF с использованием архитектуры MVVM. Я любитель в WPF, так что медведь со мной ..Как проверить дочерние объекты путем реализации IDataErrorInfo в родительском классе

У меня есть два класса моделей. Родительский класс имеет объект другого (дочернего) класса в качестве его свойства. (я имею в виду вложенные объекты и не наследуемые объекты)

Например, рассмотрим следующий сценарий.

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 в классе parent (Company)?

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

+0

Обратите внимание, что IDataErrorInfo должны быть реализованы в ViewModel, не в Модели. –

+1

да это был бы один вариант. но если я это сделаю, мне нужно создать свойство в viewmodel для каждого свойства, которое у меня есть в модели. Прямо сейчас у меня есть сам объект модели как свойство, и я напрямую привязываю элементы управления представлением к модели. – raja9787

ответ

6

Вы можете абсолютно реализовать IDataErrorInfo в базовом классе с использованием блока приложений для проверки. Here is an article, который описывает, как. Код в основном сводится к следующему:

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 
{ 
} 

 Смежные вопросы

  • Нет связанных вопросов^_^