繁体   English   中英

我应该将此功能放在View(代码隐藏)或ViewModel中吗?

[英]Should I put this function in View (code-behind) or in ViewModel?

我正在创建一个简单的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。 但它也称我的助手为模型中的助手。 所以我也认为它可以在ViewModel ViewViewModel中使用它有什么好处? 有人可以帮我提一些指示吗?

谢谢。

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

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

因此,我会在视图模型中反对抽象,以便您可以在测试期间模拟消息框

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

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

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

如果您使用Microsoft Prism,那么请查看此部分的工作原理,并模拟它或使用类似的框架。


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

以下是与您要实现的方案相关的文档: 第6章:高级MVVM方案 . 请查看

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM