将WPF Datagrid.SelectedItems传递给BackgroundWorker.RunWorkerAsync()

时间:2016-04-20 19:49:35

标签: c# wpf datagrid backgroundworker wpfdatagrid

我将一个wpf DataGrid绑定到一个名为pictures的类的ObservableCollection,我不会使用BackgroundWorker中的选定项。

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

由于我对C#很陌生,我想知道是否有一种简单/优雅/更好的方法将SelectedItems集合传递给BackgroundWorker.RunWorkerAsync()方法并将它们作为图片对象使用?

谢谢!

编辑:

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

编辑II: Datagrid绑定如下

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

当我像这样调用RunWorkerAsync时:

bgw.RunWorkerAsync(Datagrid.SelectedItems)

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

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

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

1 个答案:

答案 0 :(得分:0)

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

大量的这种建议可以用大量的盐来摄取。但是,这是解决问题的一般方法,需要在后台线程中进行大量工作而不必担心UI线程更新问题。