MVVM 和导航服务

2024-02-07

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

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

视图控制事件 -> ViewModel 命令 -> 引发事件 -> 查看 处理的事件 -> 导航

or

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


有两种解决此问题的记录方法

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

    这种方法是由 Jesse Liberty 在Part 3 http://jesseliberty.com/2011/01/06/windows-phone-from-scratch%E2%80%93mvvm-light-toolkit-soup-to-nuts-3/ his MVVM 清淡系列。他的方法是从命令向视图发送一条消息,指示应该进行导航操作。

  2. 实现处理导航的 ViewService

    这种方法是洛朗·布尼翁的回应 http://geekswithblogs.net/lbugnion/archive/2011/01/06/navigation-in-a-wp7-application-with-mvvm-light.aspx到杰​​西的帖子。这实现了一个处理由视图模型触发的所有导航操作的服务。

这两种方法仅处理 WP7 应用程序中的导航。然而,它们也可以适应 Silverligt 应用程序。

Jesse 的方法在 SL 中更容易使用,因为它不需要访问根视觉对象。然而,导航代码分布在多个地方,并且需要后台代码来执行实际导航。

Laurent 的方法需要访问根视觉对象 - 用于访问内置导航功能。正如 Laurent 的代码所示,访问此内容在 WP7 应用程序中并不是什么大问题。然而,在 SL 应用中,由于没有周围框架,情况会稍微复杂一些。然而,我已经在我的一个项目中使用附加属性实现了 SL 模式,确实进行了所需的接线 - 因此虽然需要更多工作,但它也可用于 SL。

所以得出结论 - 虽然 Jesse 的方法更容易实现,但我个人更喜欢 Laurent 的方法,因为它是更干净的架构 - 不需要后面的代码,并且功能被封装到单独的组件中,因此位于单个点。

本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

MVVM 和导航服务 的相关文章