从CollectionChanged事件处理程序中的ObservableCollection中删除项

我希望能够在将一些项目添加到ObservableCollection后拒绝它们。 我无法inheritanceObservableCollection或使用任何类型的视图,因此我似乎仅限于使用定义的一个事件处理程序(CollectionChanged)对禁止的项目执行.Remove()。 如果项目在提出和处理之间的短时间内存在,那就没关系了; 这些物品应该不会留在集合中。 在CollectionChanged事件处理程序中调用.Remove()似乎不被允许。 在运行时.NET抛出InvalidOperationException:

“在CollectionChanged事件期间无法更改ObservableCollection。”

我个人认为.NET应该允许我这样做。 如果我创建一个无限循环,这是我自己的错误。

我想使用的代码如下:

myCollection.CollectionChanged += (sender, args) => { if (args.Action == NotifyCollectionChangedAction.Remove) return; foreach (var itm in myCollection) { if (itm.name == "Fred") myCollection.Remove(itm); } } 

我不确定我有什么选择。 使用调度程序似乎不起作用。 触发另一个事件并将.Remove调用放在另一个处理程序中是另一个想到的选项。

使用Observable Collection查看常见错误 。

话虽如此,如果你仍然想要走这条路 – 你可以旋转一个新线程

如果你真的想要修改一个集合,你将想要遍历集合的副本。 因为你试图修改foreach循环中的集合,这会导致你的悲伤。

 var copy = new ObservableCollection(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); } }