using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Reflection; namespace DevExpress.Common { public static class IDataErrorInfoHelper { public static string GetErrorText(object owner, string propertyName) { string[] path = propertyName.Split('.'); if(path.Length > 1) return GetErrorText(owner, path); PropertyInfo propertyInfo = owner.GetType().GetProperty(propertyName); if (propertyInfo == null) return null; object propertyValue = propertyInfo.GetValue(owner, null); ValidationContext validationContext = new ValidationContext(owner, null, null) { MemberName = propertyName }; string[] errors = propertyInfo .GetCustomAttributes(false) .OfType() .Select(x => x.GetValidationResult(propertyValue, validationContext)) .Where(x => x != null) .Select(x => x.ErrorMessage) .Where(x => !string.IsNullOrEmpty(x)) .ToArray(); return string.Join(" ", errors); } static string GetErrorText(object owner, string[] path) { string nestedPropertyName = string.Join(".", path.Skip(1)); string propertyName = path[0]; PropertyInfo propertyInfo = owner.GetType().GetProperty(propertyName); if(propertyInfo == null) return null; object propertyValue = propertyInfo.GetValue(owner, null); IDataErrorInfo nestedDataErrorInfo = propertyValue as IDataErrorInfo; return nestedDataErrorInfo == null ? string.Empty : nestedDataErrorInfo[nestedPropertyName]; } } }