Mercurial > pub > bltoolkit
view Source/EditableObjects/EditableObjectHolder.cs @ 0:f990fcb411a9
Копия текущей версии из github
author | cin |
---|---|
date | Thu, 27 Mar 2014 21:46:09 +0400 |
parents | |
children |
line wrap: on
line source
using System; using System.Collections; using System.Reflection; using System.ComponentModel; using BLToolkit.TypeBuilder; namespace BLToolkit.EditableObjects { [Serializable] public class /*struct*/ EditableObjectHolder : IEditable, IMemberwiseEditable, ISetParent, IPrintDebugState { public EditableObjectHolder(EditableObject obj) { _original = obj; _current = obj; if (_current != null) _current.PropertyChanged += _current_PropertyChanged; } void _current_PropertyChanged(object sender, PropertyChangedEventArgs e) { EditableObject obj = _parent as EditableObject; if (obj != null) obj.OnPropertyChanged(_propertyInfo.Name + "." + e.PropertyName); } private EditableObject _original; private EditableObject _current; private object _parent; private PropertyInfo _propertyInfo; [GetValue, SetValue] public EditableObject Value { get { return _current; } set { if (_current != null) _current.PropertyChanged -= _current_PropertyChanged; _current = value; if (_current != null) _current.PropertyChanged += _current_PropertyChanged; } } #region IEditable Members public void AcceptChanges() { _original = _current; if (_current != null) _current.AcceptChanges(); } public void RejectChanges() { _current = _original; if (_current != null) _current.RejectChanges(); } public bool IsDirty { get { if (_current == null) return _original != null; return _current != _original || _current.IsDirty; } } #endregion #region IMemberwiseEditable Members public bool AcceptMemberChanges(PropertyInfo propertyInfo, string memberName) { if (memberName != propertyInfo.Name) return false; AcceptChanges(); return true; } public bool RejectMemberChanges(PropertyInfo propertyInfo, string memberName) { if (memberName != propertyInfo.Name) return false; RejectChanges(); return true; } public bool IsDirtyMember(PropertyInfo propertyInfo, string memberName, ref bool isDirty) { if (memberName != propertyInfo.Name) return false; isDirty = IsDirty; return true; } public void GetDirtyMembers(PropertyInfo propertyInfo, ArrayList list) { if (IsDirty) list.Add(propertyInfo); } #endregion #region IPrintDebugState Members public void PrintDebugState(PropertyInfo propertyInfo, ref string str) { str += string.Format("{0,-20} {1} {2,-40} {3,-40} \r\n", propertyInfo.Name, IsDirty? "*": " ", _original, _current); } #endregion #region ISetParent Members public void SetParent(object parent, PropertyInfo propertyInfo) { _parent = parent; _propertyInfo = propertyInfo; } #endregion } }