Как я могу вызвать событие CollectionChanged в ObservableCollection и передать ему измененные элементы? - PullRequest
25 голосов
/ 16 сентября 2011

У меня есть класс, который наследует от ObservableCollection и добавляет несколько дополнительных методов, таких как AddRange и RemoveRange

Мой базовый вызов метода такой:

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Reset));
}

Моя проблема в том, что я хочу получить доступ к e.NewItems или e.OldItems в событии CollectionChanged, чтобы выполнить действие с любым элементом в коллекции, и действие NotifyCollectionChangedAction.Reset не передает эти значения

void Instances_CollectionChanged(object sender, NotifyCollectionChangedEventArgs e)
{
    if (e.NewItems != null) // e.NewItems is always null
    {
        foreach (var item in e.NewItems)
        {
            if (item is EventInstanceModel)
                ((EventInstanceModel)item).ParentEvent = this;
        }
    }
}

Так что я подумал, что мог бы просто использовать NotifyCollectionChangedAction.Add вместо Reset, однако это выдает Range actions are not supported исключение

public void AddRange(IEnumerable<T> collection)
{
    var addedItems = collection.ToList();
    foreach (var i in addedItems) Items.Add(i);

    OnCollectionChanged(new NotifyCollectionChangedEventArgs(NotifyCollectionChangedAction.Add, addedItems));
}

Итак, мой вопрос: как я могу вызвать событие CollectionChanged и передать ему новый или старый список элементов?

Ответы [ 2 ]

16 голосов
/ 16 сентября 2011

Я изучал это, и, очевидно, метод CollectionChanged не может быть вызван несколькими элементами.

Так что я могу позвонить

OnCollectionChanged(new NotifyCollectionChangedEventArgs(
    NotifyCollectionChangedAction.Add, singleItem));

, но я не могу позвонить

OnCollectionChanged(new NotifyCollectionChangedEventArgs(
    NotifyCollectionChangedAction.Add, listOfItems));

Пока что я просто поднял событие Add для каждого добавленного элемента, но я все еще довольно недоволен этим, поскольку это означает, что я вызываю событие CollectionChanged для каждого элемента в методе AddRange вместо одного раза.

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) 
    {
        Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(
            NotifyCollectionChangedAction.Add, i));
    }
}
5 голосов
/ 16 сентября 2011

Это прекрасно работает для меня "автономно". Это означает, что я не использую ObservableCollection для привязки данных. Так что это не проблема ObservableCollection, а ограничение ListCollectionView.

Пожалуйста, прочитайте следующую статью, это очень интересное чтение:

Блог Натана Несбита

...