internal void NotifyValueRetrieved(object value) { CompareObjectByReferenceWrapper ValueAsKey = new CompareObjectByReferenceWrapper(value); if (value is INotifyCollectionChanged) { INotifyCollectionChanged NotifyCollectionChanged = (INotifyCollectionChanged)value; lock (this) { if (this.collectionNotifications.Contains(ValueAsKey) == false) { DebugLogger.WriteLine(this, LoggingLevel.Verbose, () => $"Attaching changing event on collection '{value}'"); NotifyCollectionChangedEventHandler Handler = WeakDelegate.Connect <EventSink, INotifyCollectionChanged, NotifyCollectionChangedEventHandler, NotifyCollectionChangedEventArgs>( this, NotifyCollectionChanged, (target, sender, e) => target.NotifyChangeExpression_CollectionChanged(sender, e), (source, handler) => source.CollectionChanged -= handler ); NotifyCollectionChanged.CollectionChanged += Handler; this.deregistrations.Add(delegate { NotifyCollectionChanged.CollectionChanged -= Handler; }); this.collectionNotifications.Add(ValueAsKey); } } } }
internal void NotifyMemberAccess(object value, MemberInfo memberInfo) { CompareObjectByReferenceWrapper ValueAsKey = new CompareObjectByReferenceWrapper(value); if (memberInfo is PropertyInfo && value is INotifyPropertyChanged) { string PropertyName = memberInfo.Name; lock (this) { if (this.propertyNotifications.ContainsKey(ValueAsKey) == false) { DebugLogger.WriteLine(this, LoggingLevel.Verbose, () => $"Attaching changing event on value '{value}'"); INotifyPropertyChanged NotifyPropertyChanged = (INotifyPropertyChanged)value; PropertyChangedEventHandler Handler = WeakDelegate.Connect <EventSink, INotifyPropertyChanged, PropertyChangedEventHandler, PropertyChangedEventArgs>( this, NotifyPropertyChanged, (target, sender, e) => target.NotifyPropertyChanged(sender, e), (source, handler) => source.PropertyChanged -= handler ); NotifyPropertyChanged.PropertyChanged += Handler; this.deregistrations.Add(delegate { NotifyPropertyChanged.PropertyChanged -= Handler; }); List <string> RegisteredPropertyNames = new List <string>(); this.propertyNotifications.Add(ValueAsKey, RegisteredPropertyNames); DebugLogger.WriteLine(this, LoggingLevel.Verbose, () => $"Adding property '{PropertyName}' to changing event of value '{value}'"); RegisteredPropertyNames.Add(PropertyName); } else { List <string> RegisteredPropertyNames = this.propertyNotifications[ValueAsKey]; if (RegisteredPropertyNames.Contains(PropertyName) == false) { DebugLogger.WriteLine(this, LoggingLevel.Verbose, () => $"Adding property '{PropertyName}' to changing event of value '{value}'"); RegisteredPropertyNames.Add(PropertyName); } else { DebugLogger.WriteLine(this, LoggingLevel.Verbose, () => $"No add property '{PropertyName}' of value '{value}': is already added"); } } } } }
private void NotifyPropertyChanged(object sender, PropertyChangedEventArgs e) { CompareObjectByReferenceWrapper SenderAsKey = new CompareObjectByReferenceWrapper(sender); bool NeedToNotify = false; lock (this) { if (this.propertyNotifications.ContainsKey(SenderAsKey)) { if (this.propertyNotifications[SenderAsKey].Contains(e.PropertyName)) { NeedToNotify = true; } } } if (NeedToNotify) { this.InvokeChanged(sender, e); } }
public override bool Equals(object other) { CompareObjectByReferenceWrapper Other = other as CompareObjectByReferenceWrapper; return(Other != null && object.ReferenceEquals(this.value, Other.value)); }