private void AddListener(INotifyPropertyChanged source, string propertyName, IWeakEventListener listener, EventHandler <PropertyChangedEventArgs> handler) { using (WriteLock) { HybridDictionary dict = (HybridDictionary)this[source]; if (dict == null) { // no entry in the hashtable - add a new one dict = new HybridDictionary(true /* case insensitive */); this[source] = dict; // listen for the desired events StartListening(source); } ListenerList list = (ListenerList)dict[propertyName]; if (list == null) { // no entry in the dictionary - add a new one list = new ListenerList <PropertyChangedEventArgs>(); dict[propertyName] = list; } // make sure list is ready for writing if (ListenerList.PrepareForWriting(ref list)) { dict[propertyName] = list; } // add a listener to the list if (handler != null) { ListenerList <PropertyChangedEventArgs> hlist = (ListenerList <PropertyChangedEventArgs>)list; hlist.AddHandler(handler); } else { list.Add(listener); } dict.Remove(AllListenersKey); // invalidate list of all listeners _proposedAllListenersList = null; // schedule a cleanup pass ScheduleCleanup(); } }
private void AddListener(object source, IWeakEventListener listener, Delegate handler) { object sourceKey = (source != null) ? source : StaticSource; using (Table.WriteLock) { ListenerList list = (ListenerList)Table[this, sourceKey]; if (list == null) { // no entry in the table - add a new one list = NewListenerList(); Table[this, sourceKey] = list; // listen for the desired event StartListening(source); } // make sure list is ready for writing if (ListenerList.PrepareForWriting(ref list)) { Table[this, source] = list; } // add a target to the list of listeners if (handler != null) { list.AddHandler(handler); } else { list.Add(listener); } // schedule a cleanup pass (heuristic (b) described above) ScheduleCleanup(); } }
protected void CopyTo(ListenerList newList) { IWeakEventListener iwel; for (int k = 0, n = Count; k < n; ++k) { Listener listener = GetListener(k); if (listener.Target != null) { if (listener.HasHandler) { Delegate handler = listener.Handler; if (handler != null) { newList.AddHandler(handler); } } else if ((iwel = listener.Target as IWeakEventListener) != null) { newList.Add(iwel); } } } }
protected void CopyTo(ListenerList newList) { IWeakEventListener iwel; for (int k=0, n=Count; k<n; ++k) { Listener listener = GetListener(k); if (listener.Target != null) { if (listener.HasHandler) { Delegate handler = listener.Handler; if (handler != null) { newList.AddHandler(handler); } } else if ((iwel = listener.Target as IWeakEventListener) != null) { newList.Add(iwel); } } } }