private void RemoveListener(object source, PropertyDescriptor pd, IWeakEventListener listener, EventHandler <ValueChangedEventArgs> handler) { using (WriteLock) { HybridDictionary dict = (HybridDictionary)this[source]; if (dict != null) { ValueChangedRecord record = (ValueChangedRecord)dict[pd]; if (record != null) { // remove a listener from the list record.Remove(listener, handler); // when the last listener goes away, remove the list if (record.IsEmpty) { dict.Remove(pd); } } if (dict.Count == 0) { Remove(source); } } } }
/// <summary> /// Remove a listener to the named property (empty means "any property")</summary> /// <param name="source">Source of the event</param> /// <param name="listener">The listener to remove</param> /// <param name="pd">Property descriptor for the value</param> private void PrivateRemoveListener(object source, IWeakEventListener listener, PropertyDescriptor pd) { Debug.Assert(listener != null && source != null && pd != null, "Listener, source, and pd of event cannot be null"); using (WriteLock) { HybridDictionary dict = (HybridDictionary)this[source]; if (dict != null) { ValueChangedRecord record = (ValueChangedRecord)dict[pd]; if (record != null) { // remove a listener from the list record.Remove(listener); // when the last listener goes away, remove the list if (record.IsEmpty) { dict.Remove(pd); } } if (dict.Count == 0) { Remove(source); } } } }