Esempio n. 1
0
        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);
            }
        }
Esempio n. 2
0
        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;
        }
Esempio n. 3
0
        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;
        }
Esempio n. 4
0
        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;
                }
            }
        }