嗨,我最近研究了 WPF 并开始学习事件和命令。我通常在按钮单击时使用命令,这会导致方法在我的“视图模型”中运行。
是否可以通过使用命令使 Button 对任何其他事件(例如 MouseOver 事件)做出反应?或者在这种情况下会使用 WPF 事件吗?
如果要使用 WPF 事件,那么事件处理程序实现是否应该只调用视图模型中的一个方法来保持关注点分散?
嗨,我最近研究了 WPF 并开始学习事件和命令。我通常在按钮单击时使用命令,这会导致方法在我的“视图模型”中运行。
是否可以通过使用命令使 Button 对任何其他事件(例如 MouseOver 事件)做出反应?或者在这种情况下会使用 WPF 事件吗?
如果要使用 WPF 事件,那么事件处理程序实现是否应该只调用视图模型中的一个方法来保持关注点分散?
这是一个公平的问题,也是 MVVM 架构领域中一个常见但“已解决”(有争议)的问题。如果您使用的是 MVVM 框架,您可能会发现类似于 EventToCommand Behavior 的内容,这里是 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”扩展在这里找到。
另一个有点刺激,但可行。
这看起来很恶心,但我相当肯定它实际上比仅使用传统的命令绑定要快一些。为了确定我需要查看 IL,我认为在这种情况下这并不重要。
/更新
然而,我想指出,这并不总是理想的情况。我发现,我经常使用 EventToCommand 来解决设计问题。请考虑以下几点:
最重要的也许是你记得你是开发者。指导方针本身并不能解决问题,但考虑指导方针可能会使问题的解决方案变得明显。
你可能想看看这篇文章:
其中讨论了事件和命令的不同用法。
至于其他事件的命令,您应该看看EventToCommand作为MVVMLight Toolkit的一部分,它允许您将任何事件附加到视图模型中的命令。非常有用,特别是如果您已经在使用 MVVM Light(我强烈推荐)。