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

16

我有一个与ObservableCollection相关联的CollectionChanged事件。这个CollectionChanged事件调用了另一个函数,该函数旨在使用原始集合中的项目更新另一个(相同类型的)集合。我已经阅读了其他关于“不能在CollectionChanged事件期间更改ObservableCollection”的帖子,我完全理解为什么不建议在CollectionChanged事件内修改集合以及为什么这可能会导致循环引用……但在这种特殊情况下,我没有修改原始集合,我只是从中添加了一个项目到另一个无关的集合。

那么我的问题是..我的做法有什么问题吗?我不明白将具有事件绑定的集合中的一项添加到另一个集合中如何再次触发事件并创建循环引用(尽管如果我对此有误,请告诉我)。

此外...有没有任何解决方法?我读过几篇建议在单独的线程上运行此操作的文章,但是当我尝试时,我却得到以下错误。

This type of CollectionView does not support changes to its SourceCollection
from a thread different from the Dispatcher thread.

我只是想更好地理解这里发生了什么。任何建议都将不胜感激。

编辑

按照要求提供简化的例子。

void originalCollection_CollectionChanged(object sender, System.Collections.Specialized.NotifyCollectionChangedEventArgs e)
{
    update(originalCollection);
}

private void update(object parameter)
{
    foreach (var originalCollectionItem in parameter)
        newCollection.Add(originalCollectionItem);
}

你遇到了什么错误? - SLaks
帖子标题是错误信息:“在 CollectionChanged 事件期间无法更改 ObservableCollection”。 - aw04
你能发布实际的代码吗? - Tom Studee
但是,如果您将Coverages作为参数传递给getCoverages,则会在foreach中修改该集合。 Coverages.Add。 - paparazzo
命名在两者中是相同的,但原始Coverages是getCoverages的参数...而不是Coverages.Add()的集合(我意识到当我打字时这听起来非常令人困惑,抱歉)。 - aw04
然后我建议您将其分解为一个简单的示例,以重现问题并使用唯一的名称。 - paparazzo
1个回答

7

第二个链接似乎已经失效了。我被重定向到 https://msdn.microsoft.com/magazine/msdn-magazine-issues,但是里面没有关于这个问题或者提出的解决方案的任何信息。 - Blueriver
1
@Blueriver,我更新了链接,它与原始链接不同,但应该包含所需的信息。 - Roberto Hernandez

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接