У меня есть класс, который наследует от 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 и передать ему список новых или старых вещей?
Я изучал это, и, очевидно, метод 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));
}
}