private void ObservedContainerOnPropertyChanged(object sender, PropertyChangedEventArgs propertyChangedEventArgs) { ObservedItem item = RelevantPropertyList.FirstOrDefault(prop => prop.Name.Equals(propertyChangedEventArgs.PropertyName)); if (item != null) { Dirty = true; UpdateCollectionChanged(sender, item); UpdatePropertyChanged(sender, item); } }
private void UpdateCollectionChanged(object container, ObservedItem item) { if (item.Collection != null) { DisconnectFromOldItems(item.Collection as IList); item.Collection.CollectionChanged -= CollectionOnCollectionChanged; } var value = item.PropertyInfo.GetValue(container) as INotifyCollectionChanged; if (value != null) { ConnectToNewItems(value as IList); value.CollectionChanged += CollectionOnCollectionChanged; } item.Collection = value; }
public DirtyObserver(INotifyDirtyChanged container) { RelevantPropertyList = new List <ObservedItem>(); ObservedContainer = container; var properties = container.GetType().GetProperties(); foreach (PropertyInfo propInfo in properties) { var attribute = propInfo.GetCustomAttributes(typeof(ObserveForDirtyAttribute), false).FirstOrDefault() as ObserveForDirtyAttribute; if (attribute != null) { ObservedItem item = new ObservedItem(propInfo.Name, propInfo); if (propInfo.PropertyType == typeof(DirtyObserver)) { throw new ArgumentOutOfRangeException("Attribute ObserveForDirty is not allowed on item DirtyObserver"); } UpdatePropertyChanged(container, item); UpdateCollectionChanged(container, item); RelevantPropertyList.Add(item); } } ObservedContainer.PropertyChanged += ObservedContainerOnPropertyChanged; }
private void UpdatePropertyChanged(object container, ObservedItem item) { var value = item.PropertyInfo.GetValue(container); if (value != null && value is DirtyObserver) { throw new ArgumentOutOfRangeException("Attribute ObserveForDirty is not allowed on item DirtyObserver"); } if (item.Property != null) { item.Property.PropertyChanged -= PropertyChangedOnPropertyChanged; item.Property = null; } if (item.DirtyChanged != null) { item.DirtyChanged.DirtyChanged -= DirtyChangedOnDirtyChanged; item.DirtyChanged = null; } var dirtyChanged = value as INotifyDirtyChanged; if (dirtyChanged != null) { dirtyChanged.DirtyChanged += DirtyChangedOnDirtyChanged; item.DirtyChanged = dirtyChanged; } else { var propertyChanged = value as INotifyPropertyChanged; if (propertyChanged != null) { propertyChanged.PropertyChanged += PropertyChangedOnPropertyChanged; item.Property = propertyChanged; } } }