2012-12-06 154 views
4

在WPF Button中,我们有一个Command参数,它可以绑定到ICommandWPF命令与事件触发命令

<Button Command="{Binding SomeCommand}"/> 

我们也可以使用EventTriggersInvokeCommandAction火一个ICommand

<Button> 
    <i:Interaction.Triggers> 
     <i:EventTrigger EventName="Click"> 
      <i:InvokeCommandAction Command="{Binding SomeCommand}"/> 
     </i:EventTrigger> 
    </i:Interaction.Triggers> 
</Button> 

他们之间和什么时候使用哪些区别是什么?

更新:

我注意到在以下情况下区别:

  • 我有这验证使用IValudationRule如果文本框为空,一个文本框。
  • 我添加了MultiDataTrigger条件,当Validation.HasError等于true时,将保存按钮的IsEnabled属性设置为false。

使用按钮命令一切正常,但使用EventTrigger它不起作用。

有什么理由呢?

回答

2

您提供的片段几乎相同,如果您不使用CanExecuteInvokeCommandAction不是原生WPF类,它创建于Interaction库中,用于控件不提供Command的情况,并且您必须将Command绑定到某个事件。例如,当你需要命令ListBox.SelectionChanged或者其他等等。

所以基于上面,我的建议是,如果可能的话,总是使用命令,只有当你不能没有它时才使用EventTrigger

基于哪个按钮的同时要注意,不是ICommand还提供CanExecute可以启用/禁用,不会在第二种情况下工作

+1

你确定交互库不会自动连接启用/禁用吗? –

+0

嗯,不知道,但是你的意思是在点击偶数或任何其他事件的情况下连线?我不认为这是真的禁用控制,如果我绑定SelectedChanged事件例如 –

0

有一个细微的差别(CanExecute),但除此之外,它只是一个问题哪部分代码正在订阅你的事件/命令。一个ICommand公开ExecuteCanExecute方法,所以......

ButtonBase的Command属性会自动转发点击事件,以命令的执行情况,并改变它是基于命令的CanExecute禁用/ endabled财产被提出......下引擎盖(你不必担心连线)。

Interaction图书馆做同样的事情,但暴露各种类,让你“建立”自己的连线以一种简单的方式。你基本上创建了几个类,他们说:“连接事件名称(ButtonBase.Click)事件来调用指定命令(SomeCommand)的ICommand.Execute方法。”实际上,如果你放弃这两个选项,你甚至可以在代码隐藏方面推出自己的代码......但是再一次,当它被提供时,没有任何意义(除了学习它是如何工作的)在一个很好,干净,通风良好的方式,单元测试,优化的方式?