使用代码隐藏来处理MVVM中的子窗口有什么缺点?

时间:2013-09-11 07:54:33

标签: c# wpf silverlight mvvm

假设需要创建子窗口并处理某些视图模型的结果。

为此,我们可以使用背后的代码。

示例:

// Code Behind
class SampleView : ISampleView
{
  public void CreateChildWindow(params string [] args)
  {
      var childWIndow = ChildViewFactory.Create(args);
      childWindow.Closed += 
      () =>  {
                if(childWindow.Result)
                {
                    this.ViewModel.DoSomething();
                }
                else
                {
                    this.ViewModel.DoSomethingElse();
                }
             };
      childWindow.Show();
  }
}

// ViewModel
class SampleViewModel
{
     private void OnSomeCommandHandler()
     {
         ((ISampleView)this.View).CreateChildWindow(new []{""});
     }

     public void DoSomething()
     {

     }

     public void DoSomethingElse()
     {

     }
}

我没有在任何地方看到这种方法,但它似乎是相当合乎逻辑的。

因为我想知道 - 使用这种模式有哪些可能的缺点?

1 个答案:

答案 0 :(得分:1)

你在这里提出了一个相当主观的问题。硬核MVVM开发人员可能表示你应该从不使用文件背后的代码,而其他人可能会说这完全没问题。

将代码与视图分离的主要原因是允许使用模拟数据访问类轻松测试视图模型代码的所有。有些人会告诉你,这种分离也允许我们换掉相同内容的不同视图,但我从来不需要这样做。

我确信你会找到那些说永远不会从视图模型中打开视图的人 - 视图模型不应该知道有关视图的任何信息。这些人会使用某种服务层从视图模型中间接启动视图。其他人会告诉你,从后面的父视图代码启动子视图正是你应该做的。

在一天结束时,这真的是个人决定适合您和您正在开发的应用程序。由于我们通常测试视图模型而不是视图(是的,我知道WPF中的自动UI测试),我会说不使用视图代码的唯一原因是因为代码不会被测试(至少在正常的方式以及视图模型代码)。

但是,我们真的需要测试启动子窗口的简单代码吗?在我看来,我们不...微软已经为我们测试了这一点。所以要回答你的问题,我会说使用代码来启动子窗口的缺点将取决于你的个人情况,但如果有的话,它不太可能是一个严重的缺点。