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

时间:2012-03-04 08:33:36

标签: c# wpf mvvm

我正在创建一个简单的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中拥有此功能有什么好处?有人可以帮我提一些指示吗?

感谢。

3 个答案:

答案 0 :(得分:7)

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

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

因此,我会在视图模型中反对抽象,以便在测试期间mock the message box

答案 1 :(得分:7)

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

中完成

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

答案 2 :(得分:2)

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

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


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

以下是与您要实施的方案相关的文档:Chapter 6: Advanced MVVM Scenarios。请查看用户交互模式部分。