Ich habe ein Wpf DataGrid an eine ObservableCollection einer Klasse namens Bilder gebunden und ich werde nicht mit den ausgewählten Elementen in einem BackgroundWorker arbeiten.Übergeben Sie WPF Datagrid.SelectedItems an BackgroundWorker.RunWorkerAsync()
Offensichtlich konnte ich alle Daten in neue ObservableCollection Element für Element kopieren.
Da ich sehr neu in C# bin, frage ich mich, ob es eine einfache/elegante/bessere Möglichkeit gibt, die SelectedItems-Sammlung an die BackgroundWorker.RunWorkerAsync() -Methode zu übergeben und mit diesen als Bildobjekte zu arbeiten?
Danke!
Edit:
Mit der Anwendung Ich möchte Dateien auszuwählen (meist Bilder) aus einem Datagrid und laden Sie diese Dateien auf einer Sharepoint-Website. Ich arbeite gut ohne den BackgroundWorder. Die Dateien können jedoch groß sein und die Anzahl der hochgeladenen Dateien beträgt bis zu 100 Dateien/Bilder. Daher möchte ich mit einem BackgroundWorker die Benutzeroberfläche von Zeit zu Zeit aktualisieren.
bearbeiten II: Das Datagrid wird wie dieses
Datagrid.Itemssource = vm.getfiles(folderpath); //where getfiles is ObservableCollection<picture>
gebunden Als ich die RunWorkerAsync wie folgt aufrufen:
bgw.RunWorkerAsync (Datagrid.SelectedItems)
und versuchen, auf sie zuzugreifen in der DoWork wie folgt
ObservableCollection<picture> si = (ObservableCollection<picture>)e.Argument;
I g et eine System.InvalidCastException: Das Objekt des Typs System.Windows.Controls.SelectedItemCollection kann nicht in MyApp.ObservableCollection geändert werden.
Nun, ich bin auch neu in der MVVM Ansatz und versuchte es zu implementieren. Also implementiert die Bildklasse das INotifyPropertyChanged. Sind die ausgewählten Elemente im Datagrid in irgendeiner Weise in der ObservableCollection markiert, die als Item-Quelle gebunden ist, sodass ich nur auf diese Objekte von der ObservableCollection zugreifen kann? –
Die ObservableCollection ist im Grunde ein Container, der alles aktualisiert, was an die Sammlung gebunden ist. Die Elemente in der Auflistung sind an die ItemTemplates gebunden, die im Steuerelement verwendet werden. Wenn Sie Ihre Elemente, die Bildklasse, aktualisieren und das PropertyChanged-Ereignis im Hintergrund-Thread auslöst, erhalten Sie eine Ausnahme, dass die Benutzeroberfläche im UI-Thread aktualisiert werden muss. Was Sie also tun sollten, ist die Trennung der Kerndaten von der Geschäftslogik. Dies erzeugt im Grunde ein Viewmodel und Modell. Ja, Sie können mit den Objekten interagieren, aber sie gehen wahrscheinlich aufgrund von UI-Updates verloren. Evetns –
Die Bildklasse hat einige Eigenschaften wie sharepoinSite und sharepointLibrary.Wenn diese aktualisiert werden, wird das UI aktualisiert (also funktioniert das irgendwie nett). Die Bildklasse hat auch eine Methode namens UploadToSharepoint (dies ist diejenige, die ich im BackgroundWorker aufrufen möchte). Die Hauptsache, über die ich mich wundere, ist, was der beste Weg ist, der BackgroundWorker.RunWorkerAsync-Methode mitzuteilen, welche Elemente im Datagrid ausgewählt wurden. –