public void RemoveListener(INotifyCollectionChanged collection, ICollectionChangedListener listener) { collection = collection ?? throw new ArgumentNullException(nameof(collection)); listener = listener ?? throw new ArgumentNullException(nameof(listener)); Dispatcher.UIThread.VerifyAccess(); if (_entries.TryGetValue(collection, out var entry)) { var listeners = entry.Listeners; for (var i = 0; i < listeners.Count; ++i) { if (listeners[i].TryGetTarget(out var target) && target == listener) { listeners.RemoveAt(i); if (listeners.Count == 0) { entry.Dispose(); _entries.Remove(collection); } return; } } } throw new InvalidOperationException( "Collection listener not registered for this collection/listener combination."); }
internal void RemoveListener(ICollectionChangedListener listener) { if (Inner is INotifyCollectionChanged incc) { CollectionChangedEventManager.Instance.RemoveListener(incc, listener); } }
public void AddListener(INotifyCollectionChanged collection, ICollectionChangedListener listener) { collection = collection ?? throw new ArgumentNullException(nameof(collection)); listener = listener ?? throw new ArgumentNullException(nameof(listener)); Dispatcher.UIThread.VerifyAccess(); if (!_entries.TryGetValue(collection, out var listeners)) { listeners = new List <WeakReference <ICollectionChangedListener> >(); _entries.Add(collection, listeners); WeakSubscriptionManager.Subscribe( collection, nameof(INotifyCollectionChanged.CollectionChanged), this); } foreach (var l in listeners) { if (l.TryGetTarget(out var target) && target == listener) { throw new InvalidOperationException( "Collection listener already added for this collection/listener combination."); } } listeners.Add(new WeakReference <ICollectionChangedListener>(listener)); }
/// <summary> /// Initializes a new instance of the <see cref="WeakCollectionChangedListener"/> /// </summary> /// <param name="source">The source event source</param> /// <param name="listener">The listener event listener</param> private WeakCollectionChangedListener( INotifyCollectionChanged source, ICollectionChangedListener listener) { this._source = source; this._source.CollectionChanged += this.SourceCollectionChanged; this._weakListener = new WeakReference(listener); }
internal static WeakCollectionChangedListener CreateIfNecessary(object source, ICollectionChangedListener listener) { if (!(source is INotifyCollectionChanged)) { return null; } return new WeakCollectionChangedListener(source as INotifyCollectionChanged, listener); }
/// <summary> /// Creates a weak listener if the source implements <see cref="INotifyCollectionChanged"/> /// </summary> /// <param name="source">The source to subscribe to</param> /// <param name="listener">The collection change listener</param> /// <returns>A weak listener instance</returns> public static WeakCollectionChangedListener CreateIfNecessary( object source, ICollectionChangedListener listener) { INotifyCollectionChanged notify = source as INotifyCollectionChanged; if (notify != null) { return new WeakCollectionChangedListener(notify, listener); } return null; }
/// <summary> /// Creates a weak listener if the source implements <see cref="INotifyCollectionChanged"/> /// </summary> /// <param name="source">The source to subscribe to</param> /// <param name="listener">The collection change listener</param> /// <returns>A weak listener instance</returns> public static WeakCollectionChangedListener CreateIfNecessary( object source, ICollectionChangedListener listener) { INotifyCollectionChanged notify = source as INotifyCollectionChanged; if (notify != null) { return(new WeakCollectionChangedListener(notify, listener)); } return(null); }
/// <summary> /// Handles collection changed events raised by the source /// </summary> /// <param name="sender">The source collection</param> /// <param name="e">The event args</param> private void SourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (this._weakListener != null) { ICollectionChangedListener target = this._weakListener.Target as ICollectionChangedListener; if (target != null) { target.OnCollectionChanged(sender, e); } else { this.Disconnect(); } } }
private void SourceCollectionChanged(object sender, NotifyCollectionChangedEventArgs e) { if (this.weakListener == null) { return; } ICollectionChangedListener target = this.weakListener.Target as ICollectionChangedListener; if (target == null) { this.Disconnect(); return; } target.OnCollectionChanged(sender, e); }
public void AddListener(INotifyCollectionChanged collection, ICollectionChangedListener listener) { collection = collection ?? throw new ArgumentNullException(nameof(collection)); listener = listener ?? throw new ArgumentNullException(nameof(listener)); Dispatcher.UIThread.VerifyAccess(); if (!_entries.TryGetValue(collection, out var entry)) { entry = new Entry(collection); _entries.Add(collection, entry); } foreach (var l in entry.Listeners) { if (l.TryGetTarget(out var target) && target == listener) { throw new InvalidOperationException( "Collection listener already added for this collection/listener combination."); } } entry.Listeners.Add(new WeakReference <ICollectionChangedListener>(listener)); }
private WeakCollectionChangedListener(INotifyCollectionChanged source, ICollectionChangedListener listener) { this.source = source; this.source.CollectionChanged += new NotifyCollectionChangedEventHandler(this.SourceCollectionChanged); this.weakListener = new WeakReference(listener); }
internal static WeakCollectionChangedListener CreateIfNecessary(object source, ICollectionChangedListener listener) { if (!(source is INotifyCollectionChanged)) { return(null); } return(new WeakCollectionChangedListener(source as INotifyCollectionChanged, listener)); }
internal static WeakCollectionChangedListener CreateIfNecessary(object source, ICollectionChangedListener listener) { var incc = source as INotifyCollectionChanged; if (incc != null) { return(new WeakCollectionChangedListener(incc, listener)); } return(null); }