using System; using System.Collections.Generic; using System.ComponentModel; using System.ComponentModel.DataAnnotations; using System.Linq; using System.Runtime.CompilerServices; namespace IOTContainer.MvvmBase { /// /// ViewModel基础类 /// public class ViewModelBase : INotifyPropertyChanged, IDataErrorInfo { #region 通知事件 /// /// 特性改变事件 /// public event PropertyChangedEventHandler PropertyChanged; /// /// 特性改变通知 /// /// 属性名,若为空则自动获取字段名 protected virtual void RaisePropertyChanged([CallerMemberName] string propertyName = null) { this.PropertyChanged?.Invoke(this, new PropertyChangedEventArgs(propertyName)); } /// /// 更改属性 并通知特性改变 /// /// 属性类型 /// 属性 /// 改变值 /// 属性名,若为空则自动获取字段名 protected void SetProperty(ref T member, T value, [CallerMemberName] string propertyName = null) { if (!object.Equals(member, value)) { member = value; this.RaisePropertyChanged(propertyName); } } #endregion #region 数据验证 /// /// 验证完整性错误 /// public string Error { get { var resultes = new List(); var context = new ValidationContext(this); if (!Validator.TryValidateObject(this, context, resultes, true) && resultes.Count > 0) { return string.Join(Environment.NewLine, resultes.Select(r => r.ErrorMessage).ToArray()); } return string.Empty; } } /// /// 验证具体字段错误 /// /// /// public string this[string columnName] { get { var resultes = new List(); var context = new ValidationContext(this); context.MemberName = columnName; var value = this.GetType().GetProperty(columnName).GetValue(this, null); if (!Validator.TryValidateProperty(value, context, resultes) && resultes.Count > 0) { return string.Join(Environment.NewLine, resultes.Select(r => r.ErrorMessage).ToArray()); } return string.Empty; } } #endregion } }