将WPF Datagrid.SelectedItems传递给BackgroundWorker.RunWorkerSync

本文关键字:BackgroundWorker RunWorkerSync WPF Datagrid SelectedItems | 更新日期: 2024-10-21 01:30:42

我已经将一个wpf DataGrid绑定到一个名为pictures的类的ObservableCollection,我习惯于在BackgroundWorker中处理所选项目。

显然,我可以一项一项地将所有数据复制到新的ObservableCollection中。

由于我是C#的新手,我想知道是否有一种简单/优雅/更好的方法可以将SelectedItems集合传递给BackgroundWorker.RunWorkerSync()方法,并将其作为图片对象使用?

谢谢!

编辑:

使用该应用程序,我想从数据网格中选择文件(主要是图片),并将这些文件上传到共享点网站。没有BackgroundWorder我工作得很好。然而,文件可能很大,上传的数量最多可达100个文件/图片。因此,我想使用BackgroundWorker来不时更新UI。

编辑II:数据网格像一样绑定

Datagrid.Itemssource = vm.getfiles(folderpath); //where getfiles is ObservableCollection<picture>

当我这样调用RunWorkerSync时:

bgw.RunWorkerSync(Datagrid.SelectedItems)

并尝试像这个一样在DoWork中访问它们

ObservableCollection<picture> si = (ObservableCollection<picture>)e.Argument;

我得到一个System.InvalidCastException:类型为System.Windows.Controls.SelectedItemCollection的对象无法更改为MyApp.ObservableCollection.

将WPF Datagrid.SelectedItems传递给BackgroundWorker.RunWorkerSync

如果您使用MVVM模式,如果它不实现INotifyPropertyChanged,我将采用该模型。然后使用您的模型,您可以确保安全地对对象进行更改。一旦你的BackgroundWorker完成了它的任务,你就可以在每个应该包装你的模型的ViewModel上引发正确的PropertyChanged事件。通过这种方式,更改将反映在视图中。这些模型将作为预期参数在其自己的列表中传递。不应在BackgroundThread中引用可观察的集合(除非您真的需要它来更新UI,否则您还需要向调度器发送一个操作)。

对这一建议的大量采纳可以持谨慎态度。然而,这是我处理需要在后台线程中做大量工作而不必担心UI线程更新问题的一般方法。

相关文章:
  • 没有找到相关文章