4

在 WPFButton中,我们有一个Command可以绑定到ICommand.

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

我们也可以使用EventTriggerswithInvokeCommandAction来触发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 则不起作用。

这有什么原因吗?

4

2 回答 2

2

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

因此,基于上述,我的建议是,如果可能,请始终使用 Command,并且EventTrigger仅在不能没有它的情况下使用。

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

于 2012-12-06T13:46:40.010 回答
0

有一点不同(CanExecute),但除此之外,这只是代码的哪一部分为您订阅事件/命令的问题。AnICommand暴露了ExecuteandCanExecute方法,所以...

ButtonBase的 Command 属性将自动将 Click 事件中继到命令的 Execute 事件,并根据命令的 CanExecute 被引发更改它的禁用/已启用属性...在幕后(您不必担心连线)。

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

事实上,如果你放弃这两个选项,你甚至可以在代码隐藏中推出自己的选项......但话又说回来,当它以很好的方式提供时(除了学习它是如何工作的)没有意义,干净,引擎盖下的方式,单元测试,优化的方式?

于 2012-12-06T13:47:32.347 回答