正确使用命令

时间:2014-03-18 17:50:52

标签: wpf mvvm

所以使用MVVM,专家如何处理这种情况?

我有一个带有打开/保存菜单项的窗口,它们都使用标准的WPF命令。 Window有一个包含命令对象的底层ViewModel。这些命令对象是实现ICommand internface的简单类的实例;例如OpenCommandSaveCommand。每个的Execute方法分别调用VM的Open()Save()函数。你知道的所有标准MVVM东西!

现在的问题是:当用户点击“打开”菜单项时,他可能已经对当前文档进行了更改,因此我希望在调用Save()之前检查并调用Open()函数。究竟谁负责这样做以及如何做?

  1. 我可以在OpenCommand.Execute()内执行此操作,并在那里调用SaveCommand.Execute()
  2. 我可以直接在VM.Save()内调用OpenCommand.Execute()函数。
  3. 我也可以在我的VM的Open()函数中调用Save()。
  4. 从原子的角度来看,Open()函数实际上应该只打开一个文档而不进行其他验证/检查。但是,同样的逻辑也适用于OpenCommand。那我该把这个功能放在哪里呢?

1 个答案:

答案 0 :(得分:0)

我认为,在这种情况下,最好对命令进行抽象,因此我建议第三段:

  

我也可以在我的VM的Save()功能中调用Open()


  

Open()函数实际上应该只打开一个文档而不进行其他验证/检查。

我同意,但是,例如,在打开门之前,首先要确保它已关闭。会成为一个单独的功能吗?我认为这将更容易,更正确:

private void Open()
{
    if (IsSomeChanges == true)
    {
        Save();
    }

    ...
}

Command是一个pattern,允许您以最小的依赖性和不同的控件调用方法View。例如,如果您必须在View一侧调用Command,例如在附加行为中,则需要使用SomeCommand.Execute()。但是在ViewModel里面你可以直接调用这些方法。