Como validar objects filho implementando IDataErrorInfo na class pai

Eu estou desenvolvendo um aplicativo WPF usando arquitetura MVVM. Eu sou um amador no WPF tão urso comigo ..

Eu tenho duas classs de modelo. Classe pai tem um object de outra class (filho) como sua propriedade. (eu quero dizer objects nesteds e não objects herdados)

Por exemplo, considere o seguinte cenário.

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

Quero validar as propriedades da entidade Employee usando o Enterprise Library Validation Block.

Consegui fazer isso implementando a interface IDataErroInfo na class do funcionário, conforme mostrado abaixo

 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(this); foreach (ValidationResult result in results) { error.AppendLine(result.Message); } return error.ToString(); } } public string this[string propertyName] { get { ValidationResults results = Validation.ValidateFromAttributes(this); foreach (ValidationResult result in results) { if (result.Key == propertyName) { return result.Message; } } return string.Empty; } } } 

Eu não quero implementar IDataErroInfo para cada modelo filho que eu criar.

Existe alguma maneira de validar o object Employee implementando IDataErrorInfo na class pai (empresa)?

E também há algum gatilho para iniciar a validação de objects. Eu gostaria de validar os objects somente quando eu quero e não o tempo todo.

Você pode absolutamente implementar o IDataErrorInfo em uma class base usando o Bloco de Aplicativos de Validação. Aqui está um artigo que descreve como. O código basicamente se resume a isso:

 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); } } 

Você pode usar esse comportamento de validação de adição de class abstrata para suas entidades herdando dele:

 public partial class Customer : DataErrorInfo { }