如果NavigationService属于UI,那么它应该在后面的XAML代码中使用,但命令发生在viewmodel上.我应该在viewmodel中的Command上引发一个事件,让View处理事件并调用Navigation吗?如果我所做的只是导航到另一个页面,那听起来有点荒谬.我不应该直接处理UI事件并从那里导航吗?
View Control Event -> viewmodel Command -> Raise Event -> View
Handled Event -> Navigationor
View Control Event -> View Handled Event -> Navigation
解决方法
>使用MVVM Light的消息传递功能实现导航这种方法由Jesse Liberty在Part 3年提出他的MVVM Ligtht汤到坚果系列.他的方法是从命令发送消息到视图,指示应该进行导航操作.
>实现一个处理导航的ViewService这个方法是Laurent Bugnion’s response到Jesse的帖子.这实现了一种服务,该服务处理由视图模型触发的所有导航操作.
这两种方法仅涉及WP7应用程序中的导航.但是,它们也可以适用于Silverligt应用程序.
Jesse的方法在SL中更容易使用,因为它不需要访问根视觉.但是,导航代码分布在多个地方,需要后面的代码才能进行实际导航.
Laurent的方法需要访问root visual – 用于访问内置导航功能.如Laurent的代码所示,访问这一点在WP7应用程序中没什么大不了的.然而,在SL应用中,由于没有环绕框架,因此稍微复杂一些.但是,我在我的一个项目中实现SL的模式使用附加属性做了必要的布线 – 所以虽然需要更多的工作,但它也可用于SL.
总而言之 – 虽然,Jesse的方法更容易实现,但我个人更喜欢Laurent的方法,因为它更清晰的架构 – 不需要代码,并且功能被封装到一个单独的组件中,因此位于一个点上.