silverlight-4.0 – MVVM和NavigationService

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

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

View Control Event -> viewmodel Command -> Raise Event -> View
Handled Event -> Navigation

or

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的方法,因为它更清晰的架构 – 不需要代码,并且功能被封装到一个单独的组件中,因此位于一个点上.

相关文章

如何在Silverlight4(XAML)中绑定IsEnabled属性?我试过简单的...
我正在编写我的第一个vb.net应用程序(但我也会在这里标记c#,...
ProcessFile()是在UIThread上运行还是在单独的线程上运行.如...
我从同行那里听说,对sharepoint的了解对职业生涯有益.我们不...
我正在尝试保存一个类我的类对象的集合.我收到一个错误说明:...
我需要根据Silverlight中的某些配置值设置给定控件的Style.我...