您的位置:首页 > 其它

【学习笔记】Silverlight框架:Jounce(7)——ViewRouter和ViewModelRouter

2011-08-09 21:31 555 查看
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

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里的思路自己实现一些扩展功能了。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: