Подтвердить что ты не робот

Как я могу собрать событие 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 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 и передать ему новый или старый список элементов?

4b9b3361

Ответ 1

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

Поэтому я могу позвонить

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

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

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

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

public void AddRange(IEnumerable<T> collection)
{
    foreach (var i in collection) 
    {
        Items.Add(i);
        OnCollectionChanged(new NotifyCollectionChangedEventArgs(
            NotifyCollectionChangedAction.Add, i));
    }
}

Ответ 2

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

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

Блог Nathan Nesbit