Как я могу вызвать событие 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, однако, что бросает!--12--> исключение

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 ответов


Я изучал это и, по-видимому,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));
    }
}

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

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

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