您好我最近看过WPF并开始学习事件和命令。我通常使用按钮点击命令,这导致方法在我的“视图模型”中运行。
是否可以通过使用提交使Button对任何其他事件(如MouseOver事件)做出反应?或者在这种情况下会使用WPF事件吗?
如果要使用WPF事件,那么事件处理程序实现是否应该在视图模型中调用方法以保持关注点?
答案 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.
另一个有点刺激,但可行。
这看起来很糟糕,但我相当确定实际上比使用传统命令要快一点 绑定。为了确保我需要看到IL,我认为在这种情况下它不重要。
<强> /更新强>
但我想指出,这并非总是理想的情况。我经常发现,我正在使用EventToCommand来解决设计问题。请考虑以下事项:
最重要的可能是你记得你是开发人员。指南本身并不能解决问题,但是对指南的考虑可能会使解决问题变得明显。
答案 1 :(得分:6)
您可能想看一下这篇文章:
WPF Commands vs Events Advantages/Disadvantages
讨论事件和命令的不同用法。
就其他事件的命令而言,您应该查看EventToCommand之类的内容,作为MVVMLight Toolkit的一部分,它允许您将任何事件附加到viewmodel中的命令。非常有用,特别是如果你已经在使用MVVM Light(我强烈推荐)。