1

这是我的情况:

我有一个用户界面 ItemsControl“ResultsPresenter”(WPF)从 ListCollectionView 中提取,它使用来自非 UserInterface 类的 BindingList“Results”作为 ListCollectionView.Source 属性。

每当我对“结果”进行更改(例如添加操作)时,我都会收到 NotSupportedException,坚持认为 {“这种类型的 CollectionView 不支持从不同于 Dispatcher 线程的线程更改其 SourceCollection。”}

看起来这个错误似乎来自“结果”集合,但错误信息似乎明显是 WPF 生成的。我想知道为什么我会抛出这个错误,以及如何在不将包含“结果”的类暴露给 WPF 相关代码的情况下解决它。

笔记:

该解决方案是在直接查看“结果”属性以进行绑定时导致此错误之后出现的,ListCollectionView 只是为了尝试和补救这种情况而引入的,很可能不是问题的一部分。

4

2 回答 2

1

结果集合引发的事件由ListCollectionView通知 UI 处理。如果这发生在非 UI 线程上,则会出现此异常。

因此,您永远不应该从非 UI 线程修改 UI 绑定集合,除非它明确支持它。我前段时间写了一个支持它的类,你可以在这里找到它。

于 2010-07-23T16:11:53.150 回答
1

自 WPF 被称为 Avalon 以来,这一直是集合更改通知的一个已知问题。请参阅Bea Stollnitz关于该主题的博客文章。

您可以通过在调度程序线程上进行集合更改来轻松解决它。因为我猜你有一个长时间运行的返回项目或更改的操作,我建议查看Rx并使用 IObservable 的 ObserveOnDispatcher 设置。总体而言, Rx使这类事情比过去容易得多。

于 2010-07-23T16:49:22.347 回答