Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/wpf/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/multithreading/4.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Wpf 如何在单独的线程中循环遍历集合并在绑定的列表框中反映当前项?_Wpf_Multithreading_Backgroundworker_Listcollectionview - Fatal编程技术网

Wpf 如何在单独的线程中循环遍历集合并在绑定的列表框中反映当前项?

Wpf 如何在单独的线程中循环遍历集合并在绑定的列表框中反映当前项?,wpf,multithreading,backgroundworker,listcollectionview,Wpf,Multithreading,Backgroundworker,Listcollectionview,我有一个绑定到可观察集合的列表框。集合中的每个项都表示一个不同的步骤,并使用一种方法来执行该步骤。我想做的是让BackgroundWorker在集合中循环,运行每个项的action方法,并让ListBox反映当前步骤 我的第一次迭代没有使用线程,只是为了让步骤继续运行。现在,我创建了一个ListCollectionView,将其设置为表示ObservableCollection中的数据,并将ListBox的ItemsSource绑定到它而不是ObservableCollection。我注意到,尽

我有一个绑定到可观察集合的列表框。集合中的每个项都表示一个不同的步骤,并使用一种方法来执行该步骤。我想做的是让BackgroundWorker在集合中循环,运行每个项的action方法,并让ListBox反映当前步骤

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


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

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

您需要签出,我认为源代码已打开

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


图:演示应用程序显示单个ObservableCollection的多个更新

我已经在多个项目中使用了它,并取得了非常好的效果