Удаление элемента из ObservableCollection в обработчике событий CollectionChanged
Я надеюсь, что смогу отклонить некоторые элементы после их добавления в ObservableCollection. Я не могу подкласс ObservableCollection или использовать какой-либо вид, поэтому я, похоже, ограничен использованием одного обработчика событий, определенного (CollectionChanged) для выполнения .Удалить() на запрещенных предметах. Это нормально, если элементы существуют в течение короткого периода между событием, вызываемым и затем обрабатываемым; элементы просто не должны сохраняться в коллекции. Зовущий.Удалить () внутри кажется, что обработчик событий CollectionChanged не разрешен. Во время выполнения .NET создает исключение InvalidOperationException:
" невозможно изменить ObservableCollection во время события CollectionChanged."
лично я думаю, что .NET должен позволить мне. Если я создаю бесконечную петлю,это моя собственная ошибка.
код, который я хотел бы использовать будет выглядеть так:
myCollection.CollectionChanged += (sender, args) =>
{
if (args.Action == NotifyCollectionChangedAction.Remove)
return;
foreach (var itm in myCollection)
{
if (itm.name == "Fred")
myCollection.Remove(itm);
}
}
Я не уверен, какие у меня есть варианты. Использование диспетчера не похоже, сработало. Запуск другого события и размещение .Удалить вызов в другом обработчике-единственный вариант, который приходит на ум.
3 ответов
проверить общие ошибки с использованием наблюдаемой коллекции.
сказав это, если вы все еще хотите пойти по этому маршруту-вы можете вращать новая тема
Если вы действительно хотите изменить коллекцию, вы захотите выполнить итерацию через копию коллекции. это потому, что вы пытаетесь изменить коллекцию в цикле foreach, что вызывает у вас горе.
пример
var copy = new ObservableCollection<YourType>(collection)
foreach(var item in copy)
{
if(item.Name == "Fred")
{
collection.Remove(item);
}
}
тем не менее, я согласен с Anurag, что вы не должны делать такие вещи с observablecollection и, конечно, не внутри события CollectionChanged.
использовать ToList()
для итерации по списку.
foreach(var item in collection.ToList())
{
if(item.Name == "Fred")
{
collection.Remove(item);
}
}