何时在WPF中使用事件而不是命令?

时间:2011-05-23 14:32:41

标签: wpf mvvm mvvm-light routed-commands eventtocommand

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

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

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

2 个答案:

答案 0 :(得分:13)

这是一个公平的问题,也是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.

另一个有点刺激,但可行。

  1. 通过en捕获命令 事件纯粹在视野中。
  2. 查询控件的DataSource Step
  3. 抓住一个字符串绑定目标 表示命令的标识符 (也许在。上使用const字符串 视图)
  4. 调用您的命令 视图模型通过反射和 传递命令参数。
  5. 这看起来很糟糕,但我相当确定实际上比使用传统命令要快一点 绑定。为了确保我需要看到IL,我认为在这种情况下它不重要。

    <强> /更新

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

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

    最重要的可能是你记得你是开发人员。指南本身并不能解决问题,但是对指南的考虑可能会使解决问题变得明显。

答案 1 :(得分:6)

您可能想看一下这篇文章:

WPF Commands vs Events Advantages/Disadvantages

讨论事件和命令的不同用法。

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