0

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

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

例子:

// 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()
     {

     }
}

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

既然我想知道 - 使用这种模式可能有哪些缺点?

4

1 回答 1

1

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

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

我相信你会发现有人说你永远不应该从视图模型中打开视图——视图模型不应该知道关于视图的任何事情。这些人会使用某种服务层从视图模型中(间接)启动视图。其他人会告诉你,从后面的父视图代码中启动子视图正是你应该做的。

归根结底,这真的是关于什么适合您和您正在开发的应用程序的个人决定。由于我们通常测试视图模型而不是视图(是的,我知道 WPF 中的自动化 UI 测试),我想说不使用后面的视图代码的唯一原因是因为该代码不会被测试(至少在与视图模型代码一起的正常方式)。

然而,我们真的需要测试启动子窗口的简单代码吗?在我看来,我们没有……微软已经为我们测试过了。因此,为了回答您的问题,我想说使用代码隐藏启动子窗口的劣势取决于您的个人情况,但如果有的话,它不太可能是一个严重的劣势。

于 2013-09-11T08:14:40.370 回答