WPF:MVVM:命令与CallMethodAction?

时间:2012-11-27 09:58:06

标签: wpf mvvm mvvm-light command-pattern

我正在学习一个新的(小)项目的MVVM模式,我有一个关于在我们的控制器上调用动作的方法的问题:

我看到很多教程他们告诉我们使用Command,暗示声明一个RelayCommand,初始化它并创建RelayCommand调用的动作。

另一方面,我有一位同事告诉我,我可以使用CallMethodAction触发器:

<i:Interaction.Triggers> 
  <i:EventTrigger> 
    <ei:CallMethodAction MethodName="Init" TargetObject="{Binding}" /> 
  </i:EventTrigger> 
</i:Interaction.Triggers> 

对我而言,他的方法的优势在于我不必为命令制作一些inits方法(可能永远不会使用)。

那我错过了什么?为什么每个人都使用命令?

2 个答案:

答案 0 :(得分:6)

命令是开箱即用的解决方案,只能附加到实现ICommand接口的元素。另一方面,事件触发器可以附加到任何事件,使它们更灵活。我遵循一般策略来使用涉及用户交互的命令(按钮,菜单),并且需要CanExecute模式。我的命令严格连接到可视界面(提供标题,图像源等)。当我想摆脱代码隐藏时,我在任何其他情况下都使用CallMethodAction。

答案 1 :(得分:4)

命令提供在ViewModel代码中禁用的功能。这可以用于自动禁用绑定到命令的例如按钮。这就是使命令变得更好的原因。此外,基于您的逻辑,您可以在同一个插槽中动态地拔出另一个Command,它将重新路由来自View的流量,而在CallMethodAction中,您将不得不在被调用的方法中编写重新路由逻辑,这将是丑陋的。

正如您所看到的,这取决于您尝试完成的内容以及您的逻辑有多复杂:)