我使用MVVM框架编写了一个手机应用程序。它结合在一起没问题 - 手机上的每个页面(视图)都有自己的ViewModel,每个ViewModel中的代码都转到dataservice并检索到适当的数据。
所以我有一个页面显示即将发布的项目的议程,其ViewModel检索了一系列事件,在XAML中我将一个Listbox绑定到此集合。 同样地,我有另一个显示OneOff事件的页面,并且在其VM中我再次调用数据服务来获取数据集合并将其绑定到其视图中的列表框。
不确定MVVM的实现有多好,但是,我最终转移到另一个数据库 - 并且很容易实现另一个数据服务,而不会触及其他任何东西,而且一切都很好。
好的 - 所以现在我希望将此应用程序重新编写到Windows应用商店应用中。我现在有一个主页面,它将显示手机上各个页面上显示的数据组合。 假设,假设上面提到的议程项目和一次性事件现在出现在同一主页上(显示内容的空间更大)
正在努力解决这对ViewModel的意义。如果MainPage只能使用一个ViewModel,我最终会得到一个巨大的ViewModel,其中包含之前多个VM中的所有功能。
或者主ViewModel应该包含ViewModel的集合。从环顾四周来看,这似乎是它可以做到的方式,但是,如果是这样,ViewModels在哪里创建? 这似乎是我以前所做的一个根本性转变。
答案 0 :(得分:1)
是的,您可以将不同的ViewModel设置为页面不同部分的绑定上下文。您可以使用Locator模式(具有ViewModel属性的一个定位器对象)或依赖注入来保持事物的构造可管理。
Gill Cleeren的大样本代码和幻灯片讨论并展示了如何使用MVVM和ViewModelLocator类来替代Contoso Cookbook sample application可以找到here。谈话本身在channel 9。
从这些幻灯片中:
数据绑定是胶水,但......
视图需要“找到”其ViewModel
- ViewModel是DataContext
可以是静态的还是动态的
- 静态:View创建ViewModel并将其设置为DataContext
动态:在运行时,View选择其ViewModel,反之亦然
2个选项:
- View-First:创建ViewModel因为创建了View
- ViewModel-First:创建ViewModel并选择View