2016-04-20 7 views
0

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.

Antwort

0

Wenn Sie das MVVM-Muster verwenden, würde ich das Modell nehmen, wenn es nicht INotifyPropertyChanged implementiert. Dann können Sie mit Ihrem Modell sicherstellen, dass Sie Änderungen am Objekt sicher vornehmen. Sobald Ihre BackgroundWorker-Aufgabe abgeschlossen ist, können Sie dann die richtigen PropertyChanged-Ereignisse für jedes ViewModel auslösen, das Ihr Modell umbrechen soll. Auf diese Weise werden die Änderungen in der Ansicht widergespiegelt. Die Modelle würden als erwartetes Argument in einer eigenen Liste übergeben. Auf die beobachtbare Sammlung sollte im BackgroundThread nicht verwiesen werden (es sei denn, Sie benötigen sie wirklich, um die Benutzeroberfläche zu aktualisieren, und selbst dann müssen Sie eine Aktion an den Dispatcher senden).

Eine erhebliche Menge dieses Hinweises kann mit einem großen Salzkorn genommen werden. Dies ist jedoch die allgemeine Art und Weise, wie ich ein Problem angehen würde, bei dem eine große Menge an Arbeit in einem Hintergrund-Thread erledigt werden müsste, ohne sich um die Probleme beim Update der UI-Threads kümmern zu müssen.

+0

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? –

+0

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 –

+0

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. –