То, что я хочу сделать, это FreezableCollection.AddRange (collectionToAdd) - PullRequest
2 голосов
/ 24 марта 2012

Что я хочу сделать, это FreezableCollection.AddRange(collectionToAdd)

Каждый раз, когда я добавляю в коллекцию FreezableCollection событие возникает и что-то происходит. Теперь у меня есть новая коллекция, которую я хотел бы добавить, но на этот раз я хочу, чтобы событие CollectionChanged FreezableCollection сработало только один раз.

Цикл и добавление их будет вызывать событие для каждого нового элемента.

Есть ли способ, которым я могу добавить к FreezableCollection все с целью, аналогично List.AddRange?

Ответы [ 2 ]

3 голосов
/ 24 марта 2012

Получите из коллекции и переопределите поведение, которое вы хотели бы изменить. Я смог сделать это так:

public class PrestoObservableCollection<T> : ObservableCollection<T>
    {
        private bool _delayOnCollectionChangedNotification { get; set; }

        /// <summary>
        /// Add a range of IEnumerable items to the observable collection and optionally delay notification until the operation is complete.
        /// </summary>
        /// <param name="itemsToAdd"></param>
        public void AddRange(IEnumerable<T> itemsToAdd)
        {
            if (itemsToAdd == null) throw new ArgumentNullException("itemsToAdd");

            if (itemsToAdd.Any() == false) { return; }  // Nothing to add.

            _delayOnCollectionChangedNotification = true;            

            try
            {
                foreach (T item in itemsToAdd) { this.Add(item); }
            }
            finally
            {
                ResetNotificationAndFireChangedEvent();
            }
        }

        /// <summary>
        /// Clear the items in the ObservableCollection and optionally delay notification until the operation is complete.
        /// </summary>
        public void ClearItemsAndNotifyChangeOnlyWhenDone()
        {
            try
            {
                if (!this.Any()) { return; }  // Nothing available to remove.

                _delayOnCollectionChangedNotification = true;

                this.Clear();
            }
            finally
            {
                ResetNotificationAndFireChangedEvent();
            }
        }

        /// <summary>
        /// Override the virtual OnCollectionChanged() method on the ObservableCollection class.
        /// </summary>
        /// <param name="e">Event arguments</param>
        protected override void OnCollectionChanged(NotifyCollectionChangedEventArgs e)
        {
            if (_delayOnCollectionChangedNotification) { return; }

            base.OnCollectionChanged(e);
        }

        private void ResetNotificationAndFireChangedEvent()
        {
            // Turn delay notification off and call the OnCollectionChanged() method and tell it we had a change in the collection.
            _delayOnCollectionChangedNotification = false;
            this.OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
        }
    }
0 голосов
/ 12 января 2018

Чтобы получить хороший ответ @ BobHorn, чтобы он работал с FreezableCollection,

из документа :

Этот член является явным интерфейсомчлен реализации.Его можно использовать только тогда, когда экземпляр FreezableCollection приведен к интерфейсу INotifyCollectionChanged.

Таким образом, вы можете сделать это с помощью приведения.

(FreezableCollection as INotifyCollectionChanged).CollectionChanged += OnCollectionChanged;
...