CollectionChanged Event - PullRequest
       19

CollectionChanged Event

0 голосов
/ 20 февраля 2012

ObservableCollection предоставляет событие CollectionChanged, когда мы добавляем, удаляем или обновляем элемент из коллекции, но оно вызывает событие для изменения отдельного элемента, например, когда я добавляю новый элемент в коллекцию, он вызываетcollection.

Теперь я хочу вызвать событие после завершения всех изменений в коллекции, например, мне нужно добавить 2 элемента, удалить один элемент и обновить 2 элемента.Событие CollectionChanged должно запускаться только после завершения всех этих операций добавления, удаления и обновления.

Или, предположим, у меня есть новая коллекция со всеми изменениями, теперь я хочу поднять CollectionChanged при назначенииНовая коллекция, например:

ObservableCollection<string> mainCollection; //assume it has some items 
mainCollection = updatedCollection; // at this point I want to raise the event.

Пожалуйста, предоставьте ваши ценные предложения.

С уважением,

BHavik

Ответы [ 3 ]

2 голосов
/ 20 февраля 2012

Это не будет работать так, как вы написали, причина в том, что вы подписались на событие объекта mainCollection, а затем заменили его другим объектом, просто ссылаясь на него с тем же именем переменной.Вам не нужно назначать коллекцию, а добавлять все элементы обновленной коллекции в основную коллекцию

РЕДАКТИРОВАТЬ: AddRange для ObservableCollection:

using System.Collections.Specialized;
using System.Collections.Generic;

namespace System.Collections.ObjectModel
{

/// <summary> 
/// Represents a dynamic data collection that provides notifications when items get added, removed, or when the whole list is refreshed. 
/// </summary> 
/// <typeparam name="T"></typeparam> 
public class ObservableCollection<T> : System.Collections.ObjectModel.ObservableCollection<T>
{

    /// <summary> 
    /// Adds the elements of the specified collection to the end of the ObservableCollection(Of T). 
    /// </summary> 
    public void AddRange(IEnumerable<T> collection)
    {
        foreach (var i in collection) Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add), collection.ToList());
    }

    /// <summary> 
    /// Removes the first occurence of each item in the specified collection from ObservableCollection(Of T). 
    /// </summary> 
    public void RemoveRange(IEnumerable<T> collection)
    {
        foreach (var i in collection) Items.Remove(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Remove), collection.ToList());
    }

    /// <summary> 
    /// Clears the current collection and replaces it with the specified item. 
    /// </summary> 
    public void Replace(T item)
    {
        ReplaceRange(new T[] { item });
    }
    /// <summary> 
    /// Clears the current collection and replaces it with the specified collection. 
    /// </summary> 
    public void ReplaceRange(IEnumerable<T> collection)
    {
        List<T> old = new List<T>(Items);
        Items.Clear();
        foreach (var i in collection) Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Replace));
    }

    /// <summary> 
    /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class. 
    /// </summary> 
    public ObservableCollection()
        : base() { }

    /// <summary> 
    /// Initializes a new instance of the System.Collections.ObjectModel.ObservableCollection(Of T) class that contains elements copied from the specified collection. 
    /// </summary> 
    /// <param name="collection">collection: The collection from which the elements are copied.</param> 
    /// <exception cref="System.ArgumentNullException">The collection parameter cannot be null.</exception> 
    public ObservableCollection(IEnumerable<T> collection)
        : base(collection) { }
}
}

Взятые из этовопрос

1 голос
/ 20 февраля 2012

Стандарт ObservableCollection<T> не поддерживает этот сценарий. Вы можете создать класс, реализующий интерфейс INotifyCollectionChanged с необходимой логикой, например, с помощью одного метода для замены всех элементов другой коллекцией.

Это может быть не очень хорошо для пользовательского интерфейса, например, если элемент, связанный с коллекцией, был выбран или сфокусирован, это состояние будет потеряно, если вы полностью повторно инициализируете коллекцию. Зависит от вашего сценария.

1 голос
/ 20 февраля 2012

Похоже, вы бы скорее следили за присваиванием переменной mainCollection, чем за событиями, которые запускают класс ObservableCollection.Как то так:

        private ObservableCollection<MyItemType> _mainCollection;
        public ObservableCollection<MyItemType> MainCollection
        {
            get
            {
                return _mainCollection;
            }
            set
            {
                _mainCollection = value;
                TriggerMyEvent(); // do whatever you like here
            }
        }
...