WPF - OpenFileDialog 是否应该在 ViewModel 中

WPF - Should OpenFileDialog be in the ViewModel

我有一个非常简单的应用程序,它可以读取用户 select 编辑的文件并将其显示在屏幕上。为此,我创建了两个视图,一个带有供用户 select 文件的按钮,另一个带有用于显示文件内容的视图。

我还有两个 ViewModel,每个视图一个,现在,当用户单击按钮 select 一个文件时,ViewModel 中的代码将使用 OpenFileDialog 并打开文件,我的问题是应该我从 MVVM 项目的 viewModel 或模型调用 OpenFileDialog?

对话框不太适合 MVVM 范例,因为它们与 OS 紧密耦合。不过,作为一般规则,您直接 unit-tested 想要的任何东西都属于视图模型,而在运行时创建 Windows GUI 对象的任何东西都属于您的视图层。考虑到这一点,视图是调用 OpenFileDialog 的适当层。你可能会发现你仍然需要打破干净的 MVVM 架构来做到这一点,所以将它抽象成一个可以注入的服务将至少让它远离你的代码的其余部分并保持良好的关注点分离。

如果您真的想正确地执行此操作,那么您必须实现一些 boiler-plate 类似于 WPF 团队为“常规”windows 编写的代码。我在这里写了一篇关于它的长篇文章,以及一个用于轻松将对话框功能添加到您自己的 MVVM 项目的库:

https://www.codeproject.com/Articles/820324/Implementing-Dialog-Boxes-in-MVVM