コード例 #1
0
        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.");
        }
コード例 #2
0
 internal void RemoveListener(ICollectionChangedListener listener)
 {
     if (Inner is INotifyCollectionChanged incc)
     {
         CollectionChangedEventManager.Instance.RemoveListener(incc, listener);
     }
 }
コード例 #3
0
        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));
        }
コード例 #4
0
 /// <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);
 }
コード例 #5
0
 internal static WeakCollectionChangedListener CreateIfNecessary(object source, ICollectionChangedListener listener)
 {
     if (!(source is INotifyCollectionChanged))
     {
         return null;
     }
     return new WeakCollectionChangedListener(source as INotifyCollectionChanged, listener);
 }
コード例 #6
0
 /// <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);
 }
コード例 #7
0
 /// <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;
 }
コード例 #8
0
        /// <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);
        }
コード例 #9
0
 /// <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();
         }
     }
 }
コード例 #10
0
        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);
        }
コード例 #11
0
        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));
        }
コード例 #12
0
 private WeakCollectionChangedListener(INotifyCollectionChanged source, ICollectionChangedListener listener)
 {
     this.source = source;
     this.source.CollectionChanged += new NotifyCollectionChangedEventHandler(this.SourceCollectionChanged);
     this.weakListener = new WeakReference(listener);
 }
コード例 #13
0
 internal static WeakCollectionChangedListener CreateIfNecessary(object source, ICollectionChangedListener listener)
 {
     if (!(source is INotifyCollectionChanged))
     {
         return(null);
     }
     return(new WeakCollectionChangedListener(source as INotifyCollectionChanged, listener));
 }
コード例 #14
0
 private WeakCollectionChangedListener(INotifyCollectionChanged source, ICollectionChangedListener listener)
 {
     this.source = source;
     this.source.CollectionChanged += new NotifyCollectionChangedEventHandler(this.SourceCollectionChanged);
     this.weakListener              = new WeakReference(listener);
 }
コード例 #15
0
        internal static WeakCollectionChangedListener CreateIfNecessary(object source, ICollectionChangedListener listener)
        {
            var incc = source as INotifyCollectionChanged;

            if (incc != null)
            {
                return(new WeakCollectionChangedListener(incc, listener));
            }
            return(null);
        }