何时在 WPF 中对命令使用事件?

Posted

技术标签:

【中文标题】何时在 WPF 中对命令使用事件?【英文标题】:When to use events over commands in WPF? 【发布时间】:2011-08-31 05:12:28 【问题描述】:

您好,我最近研究了 WPF 并开始学习事件和命令。我通常在按钮单击时使用命令,这会导致方法在我的“视图模型”中运行。

是否可以通过使用命令使 Button 对任何其他事件(例如 MouseOver 事件)做出反应?或者在这种情况下会使用 WPF 事件吗?

如果要使用 WPF 事件,那么事件处理程序实现是否应该只调用视图模型中的方法来保持关注点分散?

【问题讨论】:

如果您还没有看过,我强烈建议您观看 Laurent Bungion 的 MIX 和 Techday 视频流,包括出色的 MIX11 深潜 MVVM 广播,它涵盖了许多这些 MVVM 边缘案例。 【参考方案1】:

这是一个公平的问题,也是 MVVM 架构领域中一个常见但“已解决”(值得商榷)的问题。如果您使用的是 MVVM 框架,您可能会发现类似于 EventToCommand Behavior 的东西,here 是来自 MVVM Light Toolkit 的示例。

简而言之,这允许您将事件映射到命令绑定,如下所示:

<Rectangle Fill="White"
       Stroke="Black"
       Width="200"
       Height="100">
<i:Interaction.Triggers>
    <i:EventTrigger EventName="MouseEnter">
        <cmd:EventToCommand Command="Binding TestCommand,
                                      Mode=OneWay"
           CommandParameter="Binding Text,
                              ElementName=MyTextBox,
                              Mode=OneWay"
           MustToggleIsEnabledValue="True" />
    </i:EventTrigger>
</i:Interaction.Triggers>
</Rectangle>

更新:

这个问题还有另外两个“合理”的解决方案:

一个使用现在被认为是旧版“AttachedCommandBehavior”扩展,发现 here.

另一个有点烦人,但可行。

    通过 en 捕获命令 事件纯粹在视图中。 查询控件的数据源步骤 获取字符串绑定目标 表示您的命令的标识符 (也许在 查看) 调用您的命令 通过反射和视图模型 传入命令参数。

这看起来很恶心,但我相当肯定它实际上比使用传统命令要快一点 绑定。为了确保我需要查看 IL,我认为这在这种情况下并不重要。

/更新

但我想指出,这并不总是理想的情况。我发现,我经常使用 EventToCommand 来解决设计问题。请考虑以下几点:

使用事件和代码来处理用户界面相关的行为。 如果合适,请考虑创建具有命令绑定的自定义控件,尤其是当您发现自己使用命令来封装事件驱动的行为来设置绑定数据时,这些数据会反映在视图中。 (即根据与控件的接近程度或类似的东西设置透明度值) EventToCommand 很可能只用于处理“类似命令”的事件(双击等)而不是反应事件(鼠标悬停)。然而,没有什么能阻止这一点。以您认为合适的方式实施。

也许最重要的是您要记住自己是开发人员。指导方针本身并不能解决问题,但考虑指导方针可能会使问题的解决方案变得显而易见。

【讨论】:

【参考方案2】:

你可能想看看这篇文章:

WPF Commands vs Events Advantages/Disadvantages

其中谈到了事件和命令的不同用法。

至于其他事件的命令,您应该查看EventToCommand 之类的内容,作为MVVMLight Toolkit 的一部分,它允许您将任何事件附加到视图模型中的命令。非常有用,特别是如果您已经在使用 MVVM Light(我强烈推荐)。

【讨论】:

以上是关于何时在 WPF 中对命令使用事件?的主要内容,如果未能解决你的问题,请参考以下文章

什么时候使用事件和命令为WPF / MVVM

wpf mvvm下viewmodel中对view进行操作

MVVM 路由和中继命令

WPF 中的隧道和冒泡事件何时有用?

如何使用 MvvmCross 在 WPF 应用程序中获取命令行参数?

使用 Microsoft.Toolkit.Mvvm 和 Microsoft.Xaml.Behaviors.Wpf 将事件参数传递给命令