2010-07-05 36 views
8

我在决定从Web服务获取数据到UI的最佳方式时遇到了一些麻烦。在Windows Phone 7的MVVM应用程序中使用REST Web服务的良好体系结构?

鉴于WebClient的异步特性,您将如何构建它?

  • 模型使用WebClient的交谈web服务
  • 视图模型要求模型数据
  • 的看法是数据绑定到视图模型

在异步完成事件我需要获得数据备份出来的模型到ViewModel,这些都是我想过的。

  1. 我可以在ViewModel订阅的模型中激发一个事件。
  2. 我也许可以做一些传递回调?
  3. 或者我应该在ViewModel和Model之间做第二级的INotifyPropertyChanged事件?
  4. 还是我很困惑,完全误解MVVM?

回答

4

这取决于你想要关于MVVM的纯粹主义。

您可以将API本身视为您的模型,在这种情况下,ViewModel具有WebClient,并在异步完成时设置您的属性(并且它们会依次从它们的setter中触发PropertyChanged)。

或者你可以有一个本地模型,其中有WebClient代码(就像你听起来一样)。在这种情况下,我个人的方法是从异步完成事件中触发一个“ModelUpdated”事件。 (你的选择1)。

您的ViewModel可以侦听此事件,并触发PropertyChanged(null)让View查询所有属性或触发多个PropertyChanged事件。请记住,您并不局限于从您的setter中触发PropertyChanged。没有什么从具有方法阻止你喜欢

private void FireMultipleProperties(){ 
NotifyPropertyChanged("Property1"); 
NotifyPropertyChanged("Property2"); 
NotifyPropertyChanged("Property3"); 
} 

所以,你可以调用该方法时,模型完成填充的,而你的UI会调用更新各个特性,当他们被解雇。如果您拥有大量财产并且不想一次性用PropertyChanged(null)全部解雇他们,则只需要这样做。

+0

感谢本。我想我想保留本地模型,因为它们将用于多个ViewModel。 我不知道PropertyChanged(null),这很酷。 – Will 2010-07-06 19:33:29

1

我认为你需要在你的架构中引入一个新的层;一个服务层。通常,我将相关服务传递给ViewModel,ViewModel处理异步调用并显示忙碌状态和所有有趣的内容。例如,如果您有Product Model和ProductListViewModel以及一系列产品和搜索命令,那么您将引入一个ProductSearchService(或ProductLoadService加载所有产品)。然后,我会将ProductSearchService传递到您的ProductListViewModel构造函数(依赖注入)中,并让您的ViewModel通过调用相关服务方法并加载响应来控制产品(模型对象)的检索。

  • ProductListService返回产品(型号)名单
  • ProductListViewModel使用ProductListService获得产品
  • ProductListView结合到产品列表的ObservableCollection在ProductListViewModel。

该模式基本上类似于模型视图控制器,其中ViewModel需要更多的控制器职责。

既然你提到基于REST的Web服务,我使用MVC 2 JSON结果一胜Phone 7应用服务层的一个例子博客文章:Data Driven Win Phone 7 Apps with MVC 2 JSON services

相关问题