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