WPF命令 vs.事件触发命令

4
在WPF的Button中,我们有一个可以绑定到ICommandCommand参数。
<Button Command="{Binding SomeCommand}"/>

我们还可以使用 InvokeCommandActionEventTriggers 来触发一个 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 Command一切正常,但使用EventTrigger却无法工作。
这是什么原因?
2个回答

2
您提供的片段几乎一样,如果您不使用CanExecuteInvokeCommandAction并非原生WPF类,而是在Interaction库中创建的,用于那些控件没有提供Command时,您必须将命令绑定到某个事件上。例如,当您需要在ListBox.SelectionChanged等情况下使用命令。

因此,基于以上内容,我的建议是,如果可能,请始终使用命令,并仅在无法避免时使用EventTrigger

还要注意,ICommand也基于CanExecute提供了启用/禁用按钮的功能,在第二种情况下将无法工作。


1
你确定Interaction库不会自动连接启用/禁用吗? - myermian
嗯,不太确定,您是指在点击事件或其他事件的情况下进行连接吗?如果我绑定了SelectedChanged事件,我认为禁用控件是不正确的。 - Arsen Mkrtchyan

0

除了(CanExecute)稍有不同之外,其余都只是关于代码的哪一部分订阅事件/命令的问题。一个 ICommand 暴露了ExecuteCanExecute方法,所以...

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

Interaction 库也做同样的事情,但会暴露各种类来允许您以简单的方式“构建”自己的线路接通。您基本上正在创建几个类,这些类会说“将事件名称(ButtonBase.Click) 事件与调用指定命令(SomeCommand) 的 ICommand.Execute 方法连接起来。”

实际上,如果您选择放弃这两个选项,甚至可以在代码后端自行制作... 但是话说回来,当它以漂亮、干净、在后台的方式,经过单元测试,经过优化的方式提供时,您制作自己的方式没有任何意义吧?


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接