using System; using System.Collections.Generic; using System.ComponentModel; using System.Linq; using System.Linq.Expressions; using System.Text; namespace FWindSoft.Wpf { public class EditableItem : INotifyPropertyChanged,IEditableObject { public EditableItem() { IsEdited = false; NewAdd = false; IsListenEditing = false; } #region 实现INotifyPropertyChanged public event PropertyChangedEventHandler PropertyChanged = (sender, e) => { }; protected virtual void RaisePropertyChanged(String propertyName = "") { if (IsListenEditing) { this.IsEdited = true; } if (PropertyChanged != null) { PropertyChanged(this, new PropertyChangedEventArgs(propertyName)); } } protected void RaisePropertyChanged(Expression> propertyExpression) { if (null != propertyExpression) { var memberExpression = propertyExpression.Body as MemberExpression; if (memberExpression != null) RaisePropertyChanged(memberExpression.Member.Name); } else { throw new ArgumentNullException("propertyExpression"); } } #endregion #region 实现EditableObject,UI驱动数据 private bool m_TempEdit; public virtual void BeginEdit() { if (IsListenEditing) { m_TempEdit=IsEdited; //IsEdited = true; } } public virtual void CancelEdit() { if (IsListenEditing) { IsEdited = m_TempEdit; } } public virtual void EndEdit() { if (IsListenEditing&&!IsEdited) { this.IsEdited = true; } } #endregion /// /// 在集合中标志元素是否是新添加的 /// public bool NewAdd { get; set; } /// /// 数据是否经过了编辑,状态仅由内部维护【当前类型数据,基础类元素,不包括关联类型元素的编辑状态】 /// public bool IsEdited { get;private set; } /// /// 是否监控数据的编辑状态 /// public bool IsListenEditing { get; set; } /// /// 设置数据是否处于编辑状态 /// /// public void SetEditedState(bool isEdited) { this.IsEdited = IsEdited; } /// /// 是否处于编辑状态【包括关联的对象的编辑状态】 /// /// public virtual bool GetEditedState() { if (IsEdited) return true; var currentType = this.GetType(); var properties = currentType.GetProperties(); foreach (var propertyInfo in properties) { if (propertyInfo.PropertyType != typeof(EditableItem)) continue; EditableItem edit = propertyInfo.GetValue(this) as EditableItem; if (edit != null && edit.GetEditedState()) return true; } return false; } } }