MVVM和NavigationService

Jon*_*ski 4 mvvm silverlight-4.0 mvvm-light windows-phone-7.1

实现任何模式的许多好处之一是在应用程序中的不同层之间分离关注点.在Silverlight和MVVM的情况下,我认为NavigationService属于UI.

如果NavigationService属于UI,那么它应该在后面的XAML代码中使用,但命令发生在ViewModel上.我应该在ViewModel中的Command上引发一个事件,让View处理事件并调用Navigation吗?如果我所做的只是导航到另一个页面,那听起来有点荒谬.我不应该直接处理UI事件并从那里导航吗?

查看控制事件 - > ViewModel命令 - >提升事件 - >查看处理事件 - >导航

要么

查看控制事件 - >查看处理事件 - >导航

Axe*_*ger 6

这个问题有两种记录的方法

  1. 使用MVVM Light的消息传递功能实现导航

    这种方法由Jesse Liberty在他的MVVM Ligtht汤到坚果系列的第3部分中提出.他的方法是从命令发送消息到视图,指示应该进行导航操作.

  2. 实现处理导航的ViewService

    这种方法是Laurent Bugnion对Jesse帖子的回应.这实现了一种服务,该服务处理由视图模型触发的所有导航操作.

这两种方法仅涉及WP7应用程序中的导航.但是,它们也可以适用于Silverligt应用程序.

Jesse的方法在SL中更容易使用,因为它不需要访问根视觉.但是,导航代码分布在多个地方,需要后面的代码才能进行实际导航.

Laurent的方法需要访问root visual - 用于访问内置导航功能.如Laurent的代码所示,访问这一点在WP7应用程序中没什么大不了的.然而,在SL应用中,由于没有环绕框架,因此稍微复杂一些.但是,我在我的一个项目中实现SL的模式使用附加属性做了必要的布线 - 所以虽然需要更多的工作,但它也可用于SL.

总而言之 - 虽然,Jesse的方法更容易实现,但我个人更喜欢Laurent的方法,因为它更清晰的架构 - 不需要代码,并且功能被封装到一个单独的组件中,因此位于一个点上.