【学习笔记】Silverlight框架:Jounce(7)——ViewRouter和ViewModelRouter
2011-08-09 21:31
627 查看
ViewRouter和ViewModelRouter可以说是Jounce里的核心之一,特别是在MVVM的应用上。
-
ViewRouter实现了3个接口,分别是IFluentViewXapRouter, IPartImportsSatisfiedNotification和IEventSink<ViewNavigationArgs>。IFluentViewXapRouter主要是涉及到模块化管理,下次再说。根据上次事件通信里所讲的,通过IEventSink<ViewNavigationArgs>和IPartImportsSatisfiedNotification的合作,ViewRouter订阅了类型是ViewNavigationArgs的消息,而ViewNavigationArgs里有个属性是ViewType用于指定当前操作的视图。
-
以框架启动为例,启动时ApplicationService会发布一个类型为ViewNavigationArgs的消息,其中的ViewType是当前的Shell,这样ViewRouter就会捕获到这个消息,
首先它会通过模块化管理判断这个视图要不要去别的模块里下载(当然,Shell是肯定不用下载的,要不一开始就会启动失败),不管要不要下载最后都会调用ViewRouter里[Import]的IViewModelRouter的ActivateView方法。
-
IViewModelRouter是ViewModelRouter实现的一个主要接口,另外一个是IFluentViewModelRouter。前面我们演示过通过[Export]路由ViewModelRoute(注意名字区分,ViewModelRoute和ViewModelRouter)来关联View和ViewModel,而IFluentViewModelRouter则是实现两者关联的另一种选择,也还是在模块化管理里再讲(虽然不一定要在模块化中才能用)。
-
IViewModelRouter里定义了一系列操作View和ViewModel的方法。在ViewModelRouter的实现里,ActivateView会去为当前操作的View查找匹配的BaseViewModel,进行互相绑定(BaseViewModel也会持有View的引用)和初始化,并最终调用BaseViewModel.Activate方法。当继承BaseViewModel时,可以重写ActivateView方法(在上一篇的例子中就重写了MainViewModel里的这个方法),实现激活时的相关操作。剩下的就是各种各样获取View和ViewModel的方法了。其中的GetNonSharedViewModel和GetNonSharedView提供了不同版本的重载,可以用于获取ViewModel和View的新实例,在创建和绑定集合的时候比较有用。
-
来点例子看看NonShare的使用,继续借用下我们可爱的马达加斯加的动物们,结构如下:
Bindings
-
看一下效果如何:
-
可以看到创建NonSharedViewModel的方法我们是自己在代码里实现的,当绑定到集合时,用到了JounceViewConverter,这是Jounce里自带的,进一步封装了GetNonSharedView方法,这样就可以为每个ViewModel创建独立的View,并为不同类型的ViewModel创建不同的View。
要使用JounceViewConverter的话子项必须实现IViewModel接口并添加[ExportAsViewModel]和ViewModelRoute信息,而如果要进一步在绑定View后实现IViewModel里的初始化和激活功能的话则必须继承自BaseViewModel。
实际应用中我们常常创建Model集合而不是ViewModel集合进行绑定,这就需要进一步封装Model或者根据Jounce里的思路自己实现一些扩展功能了。
-
ViewRouter实现了3个接口,分别是IFluentViewXapRouter, IPartImportsSatisfiedNotification和IEventSink<ViewNavigationArgs>。IFluentViewXapRouter主要是涉及到模块化管理,下次再说。根据上次事件通信里所讲的,通过IEventSink<ViewNavigationArgs>和IPartImportsSatisfiedNotification的合作,ViewRouter订阅了类型是ViewNavigationArgs的消息,而ViewNavigationArgs里有个属性是ViewType用于指定当前操作的视图。
-
以框架启动为例,启动时ApplicationService会发布一个类型为ViewNavigationArgs的消息,其中的ViewType是当前的Shell,这样ViewRouter就会捕获到这个消息,
首先它会通过模块化管理判断这个视图要不要去别的模块里下载(当然,Shell是肯定不用下载的,要不一开始就会启动失败),不管要不要下载最后都会调用ViewRouter里[Import]的IViewModelRouter的ActivateView方法。
-
IViewModelRouter是ViewModelRouter实现的一个主要接口,另外一个是IFluentViewModelRouter。前面我们演示过通过[Export]路由ViewModelRoute(注意名字区分,ViewModelRoute和ViewModelRouter)来关联View和ViewModel,而IFluentViewModelRouter则是实现两者关联的另一种选择,也还是在模块化管理里再讲(虽然不一定要在模块化中才能用)。
-
IViewModelRouter里定义了一系列操作View和ViewModel的方法。在ViewModelRouter的实现里,ActivateView会去为当前操作的View查找匹配的BaseViewModel,进行互相绑定(BaseViewModel也会持有View的引用)和初始化,并最终调用BaseViewModel.Activate方法。当继承BaseViewModel时,可以重写ActivateView方法(在上一篇的例子中就重写了MainViewModel里的这个方法),实现激活时的相关操作。剩下的就是各种各样获取View和ViewModel的方法了。其中的GetNonSharedViewModel和GetNonSharedView提供了不同版本的重载,可以用于获取ViewModel和View的新实例,在创建和绑定集合的时候比较有用。
-
来点例子看看NonShare的使用,继续借用下我们可爱的马达加斯加的动物们,结构如下:
Bindings
public class Bindings { [Export] public ViewModelRoute MainBinding { get { return ViewModelRoute.Create("MainViewModel", "MainPage"); } } [Export] public ViewModelRoute PenguinBinding { get { return ViewModelRoute.Create<PenguinViewModel, PenguinView>(); } } [Export] public ViewModelRoute LemurBinding { get { return ViewModelRoute.Create<LemurViewModel, LemurView>(); } } }
-
看一下效果如何:
-
可以看到创建NonSharedViewModel的方法我们是自己在代码里实现的,当绑定到集合时,用到了JounceViewConverter,这是Jounce里自带的,进一步封装了GetNonSharedView方法,这样就可以为每个ViewModel创建独立的View,并为不同类型的ViewModel创建不同的View。
要使用JounceViewConverter的话子项必须实现IViewModel接口并添加[ExportAsViewModel]和ViewModelRoute信息,而如果要进一步在绑定View后实现IViewModel里的初始化和激活功能的话则必须继承自BaseViewModel。
实际应用中我们常常创建Model集合而不是ViewModel集合进行绑定,这就需要进一步封装Model或者根据Jounce里的思路自己实现一些扩展功能了。
相关文章推荐
- 【学习笔记】Silverlight框架:Jounce(5)——工作流
- 【学习笔记】Silverlight框架:Jounce(1)——概述
- 【学习笔记】Silverlight框架:Jounce(2)——ApplicationService
- 【学习笔记】Silverlight框架:Jounce(4)——事件通信
- 【学习笔记】Silverlight框架:Jounce(6)——Command和ViewModel
- Qt Model/View 学习笔记 (二)
- Qt Model/View 学习笔记 (四)
- Qt Model/View 学习笔记 (三)
- Qt Model/View 学习笔记 (三)
- Qt Model/View 学习笔记 (五)
- Qt Model/View 学习笔记 (一)
- Qt Model/View 学习笔记
- Qt Model/View 学习笔记 (三)
- Qt Model/View 学习笔记 (三)
- Qt Model/View 学习笔记 (三)
- Qt Model/View 学习笔记 (五)
- Qt Model/View 学习笔记 (一)
- Qt Model/View 学习笔记 (五)
- Qt Model/View 学习笔记 (五)