【问题标题】:Should I put this function in View (code-behind) or in ViewModel?我应该将此函数放在 View(代码隐藏)中还是 ViewModel 中?
【发布时间】:2012-03-04 17:11:44
【问题描述】:

我正在创建一个简单的 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 中使用它有什么好处?有人可以帮我指点一下吗?

谢谢。

【问题讨论】:

    标签: c# wpf mvvm


    【解决方案1】:

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

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

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

    【讨论】:

      【解决方案2】:

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

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

      【讨论】:

        【解决方案3】:

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

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


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

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

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 2013-12-29
          • 1970-01-01
          • 2020-07-12
          • 2012-05-02
          • 2018-11-03
          • 2011-11-02
          • 2011-03-31
          • 1970-01-01
          相关资源
          最近更新 更多