【问题标题】:Cannot change ObservableCollection during a CollectionChanged event在 CollectionChanged 事件期间无法更改 ObservableCollection
【发布时间】:2013-06-06 17:45:29
【问题描述】:

我有一个与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);
}

【问题讨论】:

  • 你遇到了什么错误?
  • 帖子的标题是错误消息。在 CollectionChanged 事件期间无法更改 ObservableCollection
  • 你能发布实际代码吗?
  • 但是,如果您将 Coverages 作为参数传递给 getCoverages,那么您正在修改 foreach 中的集合。 Coverages.Add.
  • 两者的命名相同,但原始 Coverages 是 getCoverages 中的参数......不是 Coverages.Add() 的集合(我确实意识到当我输入它时听起来多么令人困惑抱歉)

标签: c# .net observablecollection


【解决方案1】:

如果您使用的是 WindowsForms,请确保在 Form 上使用 Invoke 方法以将正在执行的代码保留在 Dispatcher 的线程中。

http://msdn.microsoft.com/en-us/library/system.windows.forms.form.invoke.aspx

或者,如果使用 WPF,请使用 Dispatcher 类。

http://dotnetpattern.com/wpf-dispatcher

【讨论】:

  • 第二个链接似乎已损坏。我被重定向到msdn.microsoft.com/magazine/msdn-magazine-issues,其中不包含有关问题或建议的解决方案的信息
  • @Blueriver 我更新了链接,它与原来的不匹配,但它应该有必要的信息。
猜你喜欢
  • 2020-06-22
  • 1970-01-01
  • 2013-01-12
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多