Ich habe ein paar Probleme mit der Entscheidung, wie ich die Daten vom Web-Service zur Benutzeroberfläche bringen kann.
Angesichts der asynchronen Natur von WebClient, wie würden Sie das erstellen?
Beim asynchronen Complete-Ereignis muss ich diese Daten aus dem Modell in das ViewModel zurückholen. Dies sind die Dinge, über die ich nachgedacht habe.
Es hängt davon ab, wie puristisch Sie über MVVM sein wollen.
Sie könnten die API selbst als Ihr Modell behandeln. In diesem Fall hat das ViewModel den WebClient und bei der Ausführung von Async würden Sie Ihre Eigenschaften festlegen (und sie würden dann PropertyChanged innerhalb ihrer Setter auslösen).
Oder Sie können ein lokales Model haben, das den WebClient-Code enthält (so wie es klingt). In diesem Fall würde mein persönlicher Ansatz ein "ModelUpdated" -Ereignis haben, das vom asynchronen Complete-Ereignis ausgelöst wird. (Ihre Option 1).
Ihr ViewModel kann auf dieses Ereignis warten und entweder PropertyChanged(null)
auslösen, damit die View nach ALL-Eigenschaften fragt, oder mehrere PropertyChanged-Ereignisse auslösen. Denken Sie daran, dass Sie nicht darauf beschränkt sind, PropertyChanged innerhalb Ihrer Setter auszulösen. Es gibt nichts, was Sie daran hindert, eine Methode wie
Sie können diese Methode also aufrufen, wenn das Modell vollständig gefüllt ist, und Ihre Benutzeroberfläche wird aufgerufen, wenn Sie jede Eigenschaft aktualisieren, wenn sie ausgelöst wird. Sie müssten dies nur tun, wenn Sie eine Menge Eigenschaften haben und nicht alle auf einmal mit PropertyChanged(null)
abfeuern möchten.
Ich denke, Sie müssen eine neue Ebene in Ihre Architektur einführen; eine Serviceschicht. Normalerweise gebe ich meine relevanten Dienste an mein ViewModel weiter und das ViewModel erledigt die Bearbeitung der asynchronen Anrufe und zeigt belegte Zustände und all diese spaßigen Sachen an.
Wenn Sie beispielsweise ein Produktmodell und ProductListViewModel mit einer Sammlung von Produkten und möglicherweise einem Suchbefehl haben, würden Sie einen ProductSearchService (oder ProductLoadService, der alle Produkte lädt) einführen. Ich würde diesen ProductSearchService dann an Ihren ProductListViewModel-Konstruktor übergeben (Dependency-Injektion) und Ihr ViewModel steuern lassen, wie die Produkte (Ihre Modellobjekte) abgerufen werden, indem die entsprechenden Servicemethoden aufgerufen und die Antwort geladen werden.
Dieses Muster ähnelt im Wesentlichen dem Model-View-Controller, wobei das ViewModel mehr Controller-Verantwortlichkeiten übernimmt.
Da Sie REST-basierte Web-Services erwähnen, habe ich einen Beispiel-Blogeintrag, in dem MVC 2-JSON-Ergebnisse als Service-Layer für eine Win Phone 7-App verwendet werden: Datengesteuerte Win Phone 7 Apps mit MVC 2 JSON-Diensten
Tags und Links c# silverlight windows-phone-7 asynchronous