Как я могу поднять событие CollectionChanged на ObservableCollection и передать ему измененные элементы?

У меня есть класс, который наследует от 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 не поддерживаются исключением

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

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

Так что мой вопрос в том, как поднять событие CollectionChangedAction и передать ему список новых или старых вещей?

26
задан Rachel 16 September 2011 в 18:57
поделиться

1 ответ

Я изучал это, и, очевидно, метод 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));
    }
}
17
ответ дан 28 November 2019 в 17:19
поделиться
Другие вопросы по тегам:

Похожие вопросы: