在 WPF 中从 ViewModel 调用 View 的最佳实践

Best practice for calling View from ViewModel in WPF

我正在寻找一个 wpf 项目的小例子,其中包含在视图之间导航的最佳实践。也许使用框架 MVVM Light 和 NavigationService 或 ServiceLocator。不是从 ViewModel 调用 View,你是怎么做到的?你的方法如何?你有项目示例吗?

我更喜欢 ViewModel 优先的方法。这意味着导航服务将视图模型作为参数,然后根据命名约定创建视图实例并将其加载到框架中。

navigationService.Navigate<SomePageViewModel>()

与基于 URI 的导航(即视图优先方法)相比,这有几个优点:

  • 更好的可测试性
  • 依赖项注入视图的可能性
  • 最重要的是:更好的可维护性。如果您重命名或移动您的页面,这将不会编译直到您修复它,这与 URI 不同。 Uri 会在运行时抛出错误

不幸的是,我现在不能给你我的示例项目,但实现你自己的项目很容易

我喜欢的一种方式是让主 window 带有内容控件。其背后是一个视图模型,其应用程序状态 属性 基于共享枚举。

枚举旨在表示当前状态,但如果更容易,请将每个状态都视为您想要显示的视图。

使用绑定到此 属性 的模板选择器,我控制在主 window 上的内容控件中呈现的视图。

此方法要求您管理一个模板选择器,其中包含每个枚举值的模板属性或要作为主要内容的视图。但是模板只需要包含您的视图实例,因此最少 XAML.

在后台,我使用 MVVM light 提供 Viewmodel 定位器数据源,使我的视图非常容易实例化。他们还使用单例视图模型,因此在使用之间管理状态。然后,我还使用消息传递框架向我的主 window 视图模型发送消息,告诉它我现在想要的状态。这意味着任何视图模型都可以 post 一条消息来切换到另一个状态,而不知道那将是什么视图,但最终主要 window 视图模型管理该转换。

很抱歉这里缺少代码示例,这是我已经做过很多次的事情的概述,但我没有一个干净的示例可以分享。

希望这足以解释我的方法,但如果这没有意义或不适合您尝试做的事情,请随时发表评论。

对于对话框...通常我有重复使用的默认对话框,但可以使用相同的原则。不是主要的 window 控件和 VM,而是有一个用于对话框的辅助控件,它的工作原理相同,但会根据请求使其可见,并在完成后自行关闭。 mvvm light messenger 再次成为您的朋友。

您的消息包含对话框 'state',它控制显示的视图。

只有当您的设计一次只允许一个对话框时,这才有效。

最后,对于标签...

我会考虑在主视图模型中有一个可观察的状态枚举集合。然后通过绑定到它来构建选项卡。不是我做过的事,但那是我要开始的地方。 –