我应该把这个函数放在View(代码隐藏)还是ViewModel中

本文关键字:隐藏 代码 还是 ViewModel View 函数 我应该 | 更新日期: 2023-09-27 18:26:50

我正在创建一个简单的WPF应用程序。我有一个函数OpenFile:

private void OpenFile(string fileName)
{
   if(!File.Exists(Helper.GetPath(fileName)))
   {
      MessageBox.Show("Error opening file");
   }
   else
   {
      //Code to handle file opening
   }
}

理想情况下,该功能应出现在哪里?我觉得它应该在.xaml.cs中,因为它访问View部分中的MessageBox。但它也调用了模型中的Helper。所以我也认为它可以在ViewModel中。在ViewViewModel中具有此功能的优点是什么?有人能帮我提些建议吗?

谢谢。

我应该把这个函数放在View(代码隐藏)还是ViewModel中

将其放在视图模型中的优势之一是可测试性。例如,您可以编写一个单元测试,检查消息框是否仅在文件存在的情况下显示(更准确地说,如果您正在访问文件系统,它将是一个集成测试)。

但是,因为您直接使用消息框,所以您的测试永远不会在构建服务器上完成,因为在显示消息框时,机器将等待用户的输入。

因此,我将在视图模型中使用抽象,以便在测试期间模拟消息框。

此函数必须在ViewModel中。您需要在视图中创建一个操作来显示错误消息,并调用此方法而不是MessageBox.Show。显示消息框需要在View中完成。

通常,您应该避免在View中实现任何业务逻辑,例如验证或处理文件。

如果您使用Microsoft Prism,您可以使用IInteractionRequest接口让视图创建MessageBox,但实际上会将必要的响应传递回视图模型。

如果您而不是使用Microsoft Prism,请查看此部分的工作原理,然后对其进行模拟或使用类似的框架。


基本上,该代码应该放在视图模型上进行可测试性测试,但替换显式调用MessageBox的行,并使用前面提到的IInteractionRequest

以下是与您希望实现的场景相关的文档:第6章:高级MVVM场景。请参阅用户交互模式一节。