0

我有一个绑定到 ObservableCollection 的 ListBox。集合中的每个项目都表示不同的步骤以及执行该步骤的方法。我想做的是在集合中有一个 BackgroundWorker 循环,运行每个项目的操作方法,并让当前步骤由 ListBox 反映。

我的第一次迭代没有使用线程,只是为了让步骤运行。现在我创建了一个 ListCollectionView,将其设置为表示 ObservableCollection 中的数据,并将 ListBox 的 ItemsSource 绑定到它而不是 ObservableCollection。我注意到运行这些步骤仍然会阻止 UI 线程的更新,即使我明确地增加了 CurrentItem。

我想在 BackgroundWorker 中使用 ListCollectionView,但我发现的大多数示例都是假设您正在修改列表的内容或排序而编写的。我不想这样做;我只是想为每次迭代增加 CurrentItem。我猜只是引用它不会让我走得太远,因为它与 UI 线程上的项目相关联并且编译器会抱怨。任何想法或指示将不胜感激。

4

2 回答 2

1

您不应该看到来自编译器的任何投诉,但如果您尝试更新任何从后台线程触发 INotifyPropertyChanged PropertyChange 的内容,您将在运行时收到异常。有几种方法可以解决这个问题。您可以使用 Dispatcher.Current.Invoke 从 DoWork 方法内部进行更新。您可以尝试通过 ProgressChanged 处理程序(在调用线程上运行)来装配某些东西,并为每个完成的步骤调用 ReportProgress。或者您可以在 RunWorkerCompleted 处理程序中进行更新(也在调用线程上运行),并且可能使用从前一个已完成处理程序触发的一系列连续 BackgroundWorker 调用(如果您不管理步骤,这可能会变得混乱)通用队列或类似的东西)。

于 2010-08-25T00:11:47.480 回答
0

您需要查看WPF 跨线程集合绑定 - 第 4 部分 - 大解决方案和我认为的来源在QuantumBitDesigns.Core

这允许您从另一个线程更新列表,并将更改自动反映在可绑定的可观察集合上。

多个线程更新 Observable 集合
图:演示应用程序显示了对单个 ObservableCollection 的多个更新

我已经在多个项目中使用了它,效果非常好。

于 2010-08-25T00:26:56.607 回答