WPF命令与事件触发器命令

时间:2012-12-06 13:39:39

标签: wpf button eventtrigger icommand

在WPF Button中,我们有一个Command参数,可以绑定到ICommand

<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。

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

这有什么原因吗?

2 个答案:

答案 0 :(得分:2)

如果您不使用CanExecute

您提供的代码段几乎相同。 InvokeCommandAction不是本机WPF类,它是在Interaction库中为控件未提供Command的情况创建的,并且您必须将Command绑定到某个事件。例如,当您需要ListBox.SelectionChanged等等的命令时

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

另请注意,ICommand还提供CanExecute基于哪个按钮可以启用/禁用,这在第二种情况下不起作用

答案 1 :(得分:0)

存在细微差别(CanExecute),但除此之外,只是代码的哪一部分订阅了事件/命令。 ICommand公开了ExecuteCanExecute方法,因此......

ButtonBase的Command属性会自动将Click事件中继到命令的Execute事件,并根据命令的CanExecute被引发来更改它的disabled / endabled属性......引擎盖下(你不必担心)关于电汇)。

Interaction库做同样的事情,但是暴露了各种类,允许你以简单的方式“构建”自己的连线。您基本上创建了几个类,其中说“连接事件名称(ButtonBase.Click)事件”以调用指定命令的ICommand.Execute方法(SomeCommand) 。“

事实上,如果你放弃这两个选项,你甚至可以在代码隐藏中推出自己的选项...但是再一次,在提供它时,没有任何意义(除了了解它是如何工作的)一个漂亮,干净,引擎盖下的方式,经过单元测试,优化的方式?