Удаление элемента из 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);
    }
}