首页 诗词 字典 板报 句子 名言 友答 励志 学校 网站地图
当前位置: 首页 > 教程频道 > 移动开发 > 移动开发 >

WP7开发中应用MVVM模式下的导航有关问题(二)

2012-07-19 
WP7开发中应用MVVM模式下的导航问题(二)上一篇是讲messager通信机制下的导航,但这种导航方式有诸多问题:首

WP7开发中应用MVVM模式下的导航问题(二)

上一篇是讲messager通信机制下的导航,但这种导航方式有诸多问题:

首先需要注册在IOC容器中的VM必须是Singleton模式,因为假如不是单例则每一次生成vm,每一次都会去消息列表中注册一个观察者,这样会导致当出现导航动作的时候,这个VM下的Navigated方法多次执行,你并不知道这个vm应该什么时间点去注销消息列表。

?

第二点是由于是单例模式下的vm,所以每次的跳出都要执行cleanup操作来重置当前view的数据,会带来一些不必要的麻烦,就好像C#的垃圾回收要你自己做一样。

?

第三点是有一些情况会出现这个view自跳转本身的view,就像一个ProfileView(个人主页)中会有好友列表,而这个好友列表又要调转到另一个ID的ProfileView,因为前一个view 跳出时已经清空了数据,在新view中重新生成数据,这就导致了返回的时候又要重新的去请求后台并渲染UI,除非你自己维护一个cache来储存这些数据,但是cache的维护导致应用的复杂度提高而且cache何时被合适的销毁又是一个问题。

?

所以我们对于有些像detailview的view就要采用非单例的模式,每一次的跳转都会生成一个新的vm,而垃圾回收让C#的runtime自己去执行。

?

好,先从ViewModelLocator开始入手。每次注入vm都采用全新的vm对象。

?

?

var page = e.Content as PhoneApplicationPage;if (page != null && page.DataContext is INavigationBase){                currentVM = page.DataContext as INavigationBase;                if (currentVM is INavigatedViewModel)                {                    (currentVM as INavigatedViewModel).OnNavigatedTo(e);                }}

?

?就直接将当前的跳转后的DataContent取出来执行里面的OnNavigatedTo等方法,控制器这次的作用主要还是导航路由和触发导航事件后的执行路由分发事件方法。


这种导航方式在单例和非单例的vm中都可以使用,因为它不依赖与vm,而只是关联了view对应的作为DataContent的vm。目前的项目我都是采用这种导航方式,比较方便

?

热点排行