【问题标题】:WPF Commands vs. event trigger commandsWPF 命令与事件触发命令
【发布时间】:2012-12-06 13:39:38
【问题描述】:

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

使用按钮命令一切正常,但使用 EventTrigger 就不行了。

有什么原因吗?

【问题讨论】:

    标签: wpf button eventtrigger icommand


    【解决方案1】:

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

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

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

    【讨论】:

    • 您确定交互库不会自动连接启用/禁用吗?
    • 嗯,不确定,但你的意思是在点击或任何其他事件的情况下它会连接吗?例如,如果我绑定 SelectedChanged 事件,我认为禁用控制是不正确的
    【解决方案2】:

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

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

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

    事实上,如果你放弃这两个选项,你甚至可以在代码隐藏中推出你自己的选项......但话又说回来,当它被提供时,没有任何意义(除了学习它是如何工作的)一种不错的、干净的、底层的方式、经过单元测试的优化方式?

    【讨论】:

      猜你喜欢
      • 2014-05-02
      • 2014-07-18
      • 2016-10-22
      • 1970-01-01
      • 2019-04-05
      • 1970-01-01
      • 1970-01-01
      • 2011-05-27
      • 2021-01-04
      相关资源
      最近更新 更多