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

是否可以通过使用commnds使Button对其他事件做出响应,例如MouseOver事件?还是在这种情况下使用WPF事件?

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

最佳答案

这是一个公平的问题,也是MVVM体系结构领域中常见但“已解决”(有争议)的问题。如果使用的是MVVM框架,则可能会发现与EventToCommand Behavior类似的内容,here是MVVM Light Toolkit中的示例。

简而言之,这使您可以将事件映射到命令绑定(bind),如下所示:

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

更新:

对于此问题,还有其他两个“合理”的解决方案:

使用here.发现的现在使用的旧版“AttachedCommandBehavior”扩展名

另一个有点恼人,但可行。
  • 通过en捕获命令
    事件纯粹在 View 中。
  • 查询控件的数据源步骤
  • 抓取字符串绑定(bind)目标
    表示您的命令的标识符
    (也许在
    查看)
  • 在以下位置调用您的命令
    通过反射和
    传递命令参数。

  • 这看起来很糟糕,但我可以肯定,实际上比使用传统命令要快一些
    绑定(bind)。为了确保我需要查看IL,在这种情况下我认为这并不重要。

    /更新

    但是我想指出,这并不总是理想的情况。我发现很多时候,我使用EventToCommand来解决一个设计问题。请考虑以下几点:
  • 使用事件和后面的代码来处理与用户界面有关的行为。
  • 考虑在适当的情况下创建具有命令绑定(bind)的自定义控件,尤其是如果您发现自己使用命令封装事件驱动的行为来设置绑定(bind)数据,然后将其反射(reflect)在 View 中时,尤其如此。 (即,根据与控件或类似控件的接近程度来设置透明度值)
  • EventToCommand应该最有可能仅用于处理“类似命令的”事件(双击等),而不用于处理无 react 的事件(鼠标悬停)。但是,没有什么可以防止这种情况。视需要实现。

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

    关于wpf - 何时在WPF中通过命令使用事件?,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/6098655/

    10-17 01:57