Пример #1
0
            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);
                        }
                    }
                }
            }
Пример #2
0
            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");
                            }
                        }
                    }
                }
            }
Пример #3
0
            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);
                }
            }
Пример #4
0
            public override bool Equals(object other)
            {
                CompareObjectByReferenceWrapper Other = other as CompareObjectByReferenceWrapper;

                return(Other != null && object.ReferenceEquals(this.value, Other.value));
            }