在 WPF 中使用 MVVM,我应该从 View 代码隐藏还是 ViewModel 启动子窗口?

2024-04-03

我对此感到困惑有一段时间了。我写的相当大RibbonWindow使用 MVVM 模式的 WPF 应用程序。屏幕上有一个RibbonBar顶部的菜单和其余部分显示各种视图。某些视图包含其他视图,其中一些具有启动子窗口的按钮。

到目前为止,我一直在查看文件后面的代码来执行此操作,但我知道使用 MVVM 时这些文件应该为空。我可以将子窗口启动代码移至 ViewModel,但随后我需要对主窗口的引用RibbonWindow(设置为子窗口所有者),这似乎不对。

任何有关如何使用 MVVM 通常实现此目的的建议或提示将不胜感激。


我通常通过创建某种 WindowViewLoaderService 来处理这个问题。当您的程序初始化时,您可以使用如下代码注册您的 Window 和 ViewModel:

WindowViewLoaderService.Register(TypeOf(MainWindowView), TypeOf(MainWindowViewModel));
WindowViewLoaderService.Register(TypeOf(MyWindowView), TypeOf(MyWindowViewModel));

然后,当您可以从 ViewModel 调用此服务时,您只需引用其他 ViewModel。例如,如果您在 MainWindowViewModel 中,您可能有如下代码:

var myChildWindowVM = new MyWindowViewModel();
WindowViewLoaderService.ShowWindow(myChildWindowVM);

然后 WindowViewLoaderService 将查找与您传递给它的指定 ViewModel 关联的 View。它将创建该视图,将其 DataContext 设置为您传入的 ViewModel,然后显示该视图。

这样你的 ViewModel 永远不会知道任何 View。

您可以非常轻松地推出自己的其中一项服务。它所需要做的就是保留一个字典,其中键是您的 ViewModelType,值是您的 ViewType。 Register 方法添加到字典中,ShowWindow 方法根据传入的 ViewModel 查找正确的视图,创建视图,设置 DataContext,然后对其调用 Show。

大多数 MVVM 框架都为您提供开箱即用的类似功能。例如,Caliburn 有一个巧妙的工具,它仅使用命名约定,在此框架中称为 ViewLocator。这是一个总结的链接:http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx http://devlicio.us/blogs/rob_eisenberg/archive/2010/07/04/mvvm-study-segue-introducing-caliburn-micro.aspx

另一方面,Cinch 将其称为 WPFUIVisualizerService,您可以在此处查看其实际效果:http://www.codeproject.com/KB/WPF/CinchIII.aspx http://www.codeproject.com/KB/WPF/CinchIII.aspx

这些应该可以帮助您顺利进行。

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

在 WPF 中使用 MVVM,我应该从 View 代码隐藏还是 ViewModel 启动子窗口? 的相关文章

随机推荐