Удаление элемента из ObservableCollection в обработчике события CollectionChanged

Я надеюсь, что смогу отклонить некоторые элементы после того, как они будут добавлены в ObservableCollection. Я не могу создать подкласс ObservableCollection или использовать какое-либо представление, поэтому я, похоже, ограничен использованием одного определенного обработчика событий (CollectionChanged) для выполнения .Remove() для запрещенных элементов. Это нормально, если элементы существуют в течение короткого периода времени между вызовом события и его последующей обработкой; элементы должны просто не сохраняться в коллекции. Вызов .Remove() в обработчике события 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);
    }
}

Я не уверен, какие у меня есть варианты. Использование диспетчера, похоже, не работает. Запуск другого события и размещение вызова .Remove в другом обработчике — единственный другой вариант, который приходит на ум.

11
задан ebpa 16 March 2012 в 19:32
поделиться