在WPF Button
中,我们有一个Command
参数,可以绑定到ICommand
。
<Button Command="{Binding SomeCommand}"/>
我们也可以EventTriggers
与InvokeCommandAction
一起使用ICommand
。
<Button>
<i:Interaction.Triggers>
<i:EventTrigger EventName="Click">
<i:InvokeCommandAction Command="{Binding SomeCommand}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
</Button>
它们与何时使用它有什么区别?
更新
我注意到以下情况的不同之处:
使用Button命令一切正常,但使用EventTrigger它不起作用。
这有什么原因吗?
答案 0 :(得分:2)
CanExecute
,您提供的代码段几乎相同。 InvokeCommandAction
不是本机WPF
类,它是在Interaction
库中为控件未提供Command
的情况创建的,并且您必须将Command绑定到某个事件。例如,当您需要ListBox.SelectionChanged
等等的命令时
基于以上所述,我的建议是,如果可能的话,总是使用Command,只有当你不能没有它时才使用EventTrigger
。
另请注意,ICommand
还提供CanExecute
基于哪个按钮可以启用/禁用,这在第二种情况下不起作用
答案 1 :(得分:0)
存在细微差别(CanExecute),但除此之外,只是代码的哪一部分订阅了事件/命令。 ICommand
公开了Execute
和CanExecute
方法,因此......
ButtonBase
的Command属性会自动将Click事件中继到命令的Execute事件,并根据命令的CanExecute被引发来更改它的disabled / endabled属性......引擎盖下(你不必担心)关于电汇)。
Interaction
库做同样的事情,但是暴露了各种类,允许你以简单的方式“构建”自己的连线。您基本上创建了几个类,其中说“连接事件名称(ButtonBase.Click)事件”以调用指定命令的ICommand.Execute方法(SomeCommand) 。“
事实上,如果你放弃这两个选项,你甚至可以在代码隐藏中推出自己的选项...但是再一次,在提供它时,没有任何意义(除了了解它是如何工作的)一个漂亮,干净,引擎盖下的方式,经过单元测试,优化的方式?