Update UI von der ViewModel-Klasse (MVVM-pattern) in WPF
Ich bin mit dem MVVM-Muster in meine erste WPF-Anwendung und haben ein problem mit etwas, das Recht einfach ist, nehme ich an.
Wenn der Nutzer auf die Schaltfläche "speichern" in meiner Sicht, ein Befehl wird ausgeführt, ruft die private void Speichern() in meinem ViewModel.
Das problem ist, dass der code in "Save()" dauert einige Zeit zum ausführen, also würde ich gerne zum ausblenden der Schaltfläche "Speichern" in der UI-Ansicht vor der Ausführung der großen Batzen code.
Das problem ist, dass die Ansicht nicht aktualisieren, bis der gesamte code wird ausgeführt, in das viewmodel.
Wie kann ich erzwingen Sie die Ansicht neu zu zeichnen und zu verarbeiten, das PropertyChanged-Ereignisse vor der Ausführung der Save () - code?
Zusätzlich würde ich gerne eine reuseable, so dass ich kann leicht tun die gleiche Sache in anderen Seiten als gut.. Jemand anderes so etwas schon? Ein "Loading..." - Meldung?
Du musst angemeldet sein, um einen Kommentar abzugeben.
Wenn es dauert eine lange Zeit, ziehen Sie die Verwendung einer separaten thread, zum Beispiel mit einer
BackgroundWorker
, sodass der UI-thread kann bleiben ansprechbar (D. H. die Aktualisierung der Benutzeroberfläche), während der Vorgang durchgeführt wird.In Ihrem
Save
- Methode, Sie würdeIsBusySaving
boolean, die gebunden ist, um Ihre UI blendet die Schaltfläche Speichern und vielleicht zeigt einige Fortschritte bar mitIsIndeterminate = True
) undBackgroundWorker
.In der
DoWork
event-handler für das BackgroundWorker, tun Sie das langwierige sparsamen Betrieb.In der
RunWorkerCompleted
Ereignisprozedur, die ausgeführt wird, in dem UI-Faden, legen SieIsBusySaving
auf false und vielleicht ändern andere Sachen in der Benutzeroberfläche, um zu zeigen, dass Sie fertig sind.Code-Beispiel (ungetestet):
Application.Current.Dispatcher.Invoke
oder dieReportProgress
Methode/ProgressChanged
event-Kombination derBackgroundWorker
.BooleanToVisibilityConverter
.Bist du mit MVVM-Muster, so dass Ihre Schaltfläche Speichern den Befehl auf eine Instanz der RoutedCommand-Objekt, das Hinzugefügt wird, um das Fenster CommandBindings-Sammlung aufgenommen werden, die entweder deklarativ oder Imperativ.
Unter der Annahme, dass Sie es tun deklarativ. So etwas wie
Für den der handler Ausgeführt geleitet Ereignis, das der Save () - Methode, bei der Einreise, legen Sie eine variable auf false, bei der Rückkehr legen Sie es wieder auf true. So etwas wie.
Für das CanExecute-handler des routed-event, die Save_CanExecute () - Methode, verwenden Sie die variable als eine der Bedingung.
Ich hoffe, ich bin klar. 🙂
Konnte man immer etwas tun, wie dieses:
Dann konnte Sie binden die IsEnabled-Eigenschaft der Schaltfläche auf den CanSave-Eigenschaft, und es wird automatisch aktiviert/deaktiviert werden. Eine alternative Methode, und eine, die ich gehen würde, mit wäre das mit dem Befehl CanExecute zu Sortieren, aber die Idee ist ähnlich genug für Sie, mit zu arbeiten.
http://geekswithblogs.net/NewThingsILearned/archive/2008/08/25/refresh--update-wpf-controls.aspx
Erreichen Sie dies durch den folgenden code.
alles tun, Ihre langwieriger Prozess in dowork() Methode
in einige andere Methode...
Dadurch wird zum ausführen speichern langwieriger Prozess ist, in einem anderen thread und wird nicht blockieren der Benutzeroberfläche, wenn Sie zeigen möchten, eine animation, während der Benutzer auf die Schaltfläche speichern klicken, dann zeigen einige Fortschrittsanzeige wie iPhone usw... geben Sie mir feedback, ich werde versuchen, Ihnen zu helfen sogar noch mehr.
Späte Antwort, aber ich dachte, es würde gut sein, um input-als auch ein bisschen.
Statt der Erstellung Ihrer eigenen neuen thread, wäre es wahrscheinlich besser, es zu verlassen bis zu den threadpool ausgeführt speichern. Es nicht zwingen, es zu laufen, sofort wie die Erstellung Ihrer eigenen thread, aber es erlaubt Ihnen, zu speichern, threading-Ressourcen.
Den Weg das zu tun ist:
Das problem mit diesem Ansatz ist auch, dass Sie verpflichtet sind, Ihre "Save ()" - Methode nehmen Sie in einem Objekt, das Sie handeln wie ein Staat. Ich hatte ein ähnliches problem, zu verkaufen und beschlossen, diesen Weg zu gehen, denn der Ort, an dem ich arbeite, ist sehr Ressourcen-Bedürftig.