我将一个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。
答案 0 :(得分:0)
如果您使用MVVM模式,我将采用该模型,如果它没有实现INotifyPropertyChanged。然后使用您的模型,您可以确保安全地更改对象。一旦BackgroundWorker完成其任务,您就可以在应该包装模型的每个ViewModel上引发正确的PropertyChanged事件。这样,更改就会反映在视图中。模型将作为预期参数传递到自己的列表中。不应在BackgroundThread中引用可观察集合(除非您确实需要它来更新UI,否则您将需要向调度程序发送操作)。
大量的这种建议可以用大量的盐来摄取。但是,这是解决问题的一般方法,需要在后台线程中进行大量工作而不必担心UI线程更新问题。