2010-09-30 25 views
6

Gibt es potenzielle Probleme beim Aktualisieren der UI-gebundenen Eigenschaften des ViewModels vom Backgroundworker? Ich versuche, die VM zu aktualisieren, während sie an die Benutzeroberfläche gebunden ist und möglicherweise Benutzer eingeben .. Wie funktioniert die Synchronisierung hier (ich glaube nicht, ich kann Lock-Anweisungen von XAML verwenden).WPF MVVM Aktualisieren der UI Gebundene Eigenschaften von BackgroundWorker

Vielen Dank im Voraus ..

Antwort

3

Wenn Sie skalare Eigenschaften aktualisieren, müssen Sie sich keine Gedanken darüber machen, dies im UI-Thread zu tun. Das Ereignis PropertyChanged wird automatisch an den UI-Thread weitergeleitet.

Allerdings funktioniert nicht für Sammlungen, die INotifyCollectionChanged implementieren. Das CollectionChanged-Ereignis wird nicht zum UI-Thread gemarshallt und verursacht eine Ausnahme. Wenn Sie also eine Sammlung ändern, die an eine ItemsControl gebunden ist, müssen Sie Dispatcher.Invoke (oder einen anderen Synchronisationsmechanismus) verwenden, um dies im UI-Thread zu tun. Eine andere Option besteht darin, eine spezialisierte Sammlung zu verwenden, die dafür sorgt, dass das Ereignis zum richtigen Thread geleitet wird. Ein Beispiel für eine solche Sammlung finden Sie unter this article.

+0

I Ich benutze Josh Einsteins (http://stackoverflow.com/questions/2091988/how-do-i-update-an-observablecollection-via-a-worker-thread) AddOnUI zum Aktualisieren von Sammlungen. Aber ich bin hauptsächlich besorgt über Objekt-Eigenschaft in der MVVM, die wiederum andere Eigenschaften des ViewModel Feeds. – Bhuvan

1

Nach meiner Erfahrung mit Silverlight und versucht so zu tun, wird eine Ausnahme ohnehin verursachen.

Grundsätzlich müssen Sie die gebundenen Eigenschaften aus dem Dispatcher-Thread aktualisieren, als ob Sie die Benutzeroberfläche direkt ändern würden.

Um das Ansichtsmodell zu tun, um zu ermöglichen, dass ein wirkliches Dispatcher, ohne zu wissen, ich habe es nützlich fand eine IDispatcher Schnittstelle zu erstellen, dann ein SameThreadDispatcher für Tests verwenden und ein SystemDispatcher (die Delegierten an die Realität) für Produktion. Sie übergeben dann das ViewModel die IDispatcher als eine Abhängigkeit.

+0

Ich weiß nichts über Silverlight, aber in WPF * können * Sie ViewModel-Eigenschaften aus einem Worker-Thread ohne Probleme aktualisieren, aber Sammlungen müssen auf dem UI-Thread geändert werden ... (siehe meine Antwort für Details) –

Verwandte Themen