2010-12-18 3 views
0

Ich habe eine ObservableCollection, die an eine ListBox in meiner Ansicht gebunden ist. In meinem ViewModel ist ein Befehl. In diesem Befehl möchte ich alle MyObjects aktualisieren.WPF - Daten im Hintergrund herunterladen ein Update Objekte an die Benutzeroberfläche gebunden

Beispielcode:

foreach(MyObject in List) 
myobject.Prop = HelperClass.downloadData(); 

die Downloadfunktion dauert einige Zeit, ...

, wenn ich den Befehl für einige Minuten laufen nichts passiert ... und plötzlich die Ansicht aktualisiert wird.

Kann mir jemand helfen?

Dank

+0

Siehe http://stackoverflow.com/questions/4759459/how-to-update-observablecollection-from-inside-a-backgroundworker-using-mvvm/4760266#4760266 –

Antwort

0

, wenn der Thread GUI-Anwendungen zu tun, die Pflege ist die Ansicht, die Zeichnung die gleichen, die die Ereignisse ausgeführt wird, so dass, wenn Sie in einem Ereignisblock dieses Thema der ui einfriert, versuchen Hintergrund Arbeiter zu verwenden:

BackgroundWoker bg = new BackGroundWorker(); 

bg.DoWork += (sender,args) => 
{ 

foreach(MyObject in List) 
myobject.Prop = HelperClass.downloadData(); 
}; 
bg.RunWorkerAsync(); 

Der BackgroundWorker arbeitet in einem anderen Thread, der den UI-Thread freigibt. Wenn dieser Code nichts auf der Benutzeroberfläche ändert, können Sie ein Arbeitselement einfach in den Thread-Pool einreihen.

+0

Dies funktioniert nicht ... ich bekomme den Fehler : Muss DependencySource für denselben Thread wie das DependencyObject erstellen. – user547064

+0

Sie müssen den Hintergrund-Worker im UI-Thread erstellen, damit er den Thread-Ausführungskontext der Benutzeroberfläche ausführt, um Änderungen daran vorzunehmen. – DVD

+0

Ich habe den Worker im Hauptcode hinter der Datei erstellt, nachdem ich window.show() aufgerufen hatte :( – user547064

Verwandte Themen