在Windows Phone 7的MVVM应用程序中使用REST Web服务的良好架构?

Wil*_*ill 8 c# silverlight asynchronous windows-phone-7

我在确定从Web服务到UI获取数据的最佳方法时遇到了一些麻烦.

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

  • Model使用WebClient与webservice通信
  • ViewModel向模型询问数据
  • View是数据绑定到ViewModel

在Async完成事件中,我需要将数据从模型中取回ViewModel,这些是我想到的.

  1. 我可以在模型中触发ViewModel订阅的事件.
  2. 我或许可以做一些传递回调的事情?
  3. 或者我应该在ViewModel和Model之间进行第二级INotifyPropertyChanged事件?
  4. 或者我非常困惑并完全误解MVVM?

Ben*_*ood 4

这取决于您想要对 MVVM 有多纯粹。

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

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

您的 ViewModel 可以侦听此事件,并触发 aPropertyChanged(null)让视图请求所有属性,或触发多个 PropertyChanged 事件。请记住,您并不局限于从 setter 中触发 PropertyChanged。没有什么可以阻止你使用像这样的方法

private void FireMultipleProperties(){
NotifyPropertyChanged("Property1");
NotifyPropertyChanged("Property2");
NotifyPropertyChanged("Property3");
}
Run Code Online (Sandbox Code Playgroud)

因此,您可以在模型完成填充时调用该方法,并且您的 UI 将在触发每个属性时调用更新它们。仅当您有大量属性并且不想使用 一次性将它们全部解雇时,您才需要执行此操作PropertyChanged(null)