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

ebp*_*bpa 11 c# observablecollection

我希望能够在将一些项目添加到ObservableCollection后拒绝它们.我无法继承ObservableCollection或使用任何类型的视图,所以我似乎只限于使用定义的一个事件处理程序(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);
    }
}
Run Code Online (Sandbox Code Playgroud)

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

Raj*_*han 17

使用Observable Collection查看常见错误.

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

  • 您好,该链接似乎不再可用。 (2认同)
  • @MetaSnarf 经过一番研究,我终于找到了一个工作链接:https://ripcode.net/p/clinq/wiki/74840/adding-to-a-source-collection-from-a-collection-changed-event-handler (2认同)

tam*_*tam 13

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

var copy = new ObservableCollection<YourType>(collection)
foreach(var item in copy)
{
    if(item.Name == "Fred")
    {
        collection.Remove(item);
    }

}
Run Code Online (Sandbox Code Playgroud)

那就是说,我同意Anurag你不应该用observablecollection来做这类事情,当然也不应该在CollectionChanged事件中.