Я испытываю немного затруднений, выбирающих лучший способ получить данные от веб-сервиса до UI.
Учитывая асинхронную природу WebClient, как Вы создали бы это?
На Асинхронном полном событии я должен вытащить те данные назад из модели в ViewModel, это вещи, о которых я думал.
Это зависит от того, насколько пуристом вы хотите быть в отношении MVVM.
Вы можете рассматривать сам API как свою модель, и в этом случае ViewModel имеет WebClient, а после завершения Async вы должны установить свои свойства (и они, в свою очередь, активируют PropertyChanged из своих установщиков).
Или у вас может быть локальная Модель, в которой есть код WebClient (как это похоже на вас). В этом случае мой личный подход заключался бы в том, чтобы иметь событие «ModelUpdated», которое запускается из события завершения Async. (Ваш вариант 1).
Модель ViewModel может прослушивать это событие и либо запускать PropertyChanged (null)
, чтобы View запрашивал ВСЕ свойства, либо запускать несколько событий PropertyChanged. Помните, что вы не ограничены запуском PropertyChanged из ваших сеттеров. Ничто не мешает вам иметь такой метод, как
private void FireMultipleProperties(){
NotifyPropertyChanged("Property1");
NotifyPropertyChanged("Property2");
NotifyPropertyChanged("Property3");
}
, поэтому вы можете вызвать этот метод, когда модель завершит заполнение, и ваш пользовательский интерфейс будет вызывать обновление каждого свойства, когда они запускаются. Вам нужно сделать это только в том случае, если у вас есть тонна свойств и вы не хотите запускать их все сразу с помощью PropertyChanged (null)
.
Я думаю, вам нужно ввести новый уровень в вашу архитектуру; уровень обслуживания. Обычно я передаю свои соответствующие службы своей модели ViewModel, а ViewModel обрабатывает асинхронные вызовы и показывает состояния занятости и все эти забавные вещи.
Например, если у вас есть модель продукта и ProductListViewModel с набором продуктов и, возможно, командой поиска, тогда вы должны ввести ProductSearchService (или ProductLoadService, который загружает все продукты). Затем я передал бы этот ProductSearchService в ваш конструктор ProductListViewModel (внедрение зависимостей) и позволил бы вашей модели ViewModel управлять извлечением продуктов (объектов вашей модели), вызывая соответствующие методы службы и загружая ответ.
Этот шаблон по существу напоминает модель-представление-контроллер, где модель представления берет на себя больше функций контроллера.
Поскольку вы упомянули веб-службы на основе REST, у меня есть пример сообщения в блоге об использовании результатов MVC 2 JSON в качестве уровня обслуживания для приложения Win Phone 7: Управляемые данными приложения Win Phone 7 с сервисами MVC 2 JSON