16

我有一个CollectionChangedObservableCollection. 然后,此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);
}
4

1 回答 1

7

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

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

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

http://dotnetpattern.com/wpf-dispatcher

于 2013-06-06T17:50:23.780 回答