我对Mvvmlight中的RelayCommand
和EventToCommand
感到困惑。
似乎EventToCommand
处理EventTrigger
并调用RelayCommand
来完成工作。
如:
<i:Interaction.Triggers>
<i:EventTrigger x:Uid="i:EventTrigger_1" EventName="MouseLeftButtonUp">
<cmd:EventToCommand x:Uid="cmd:EventToCommand_1" Command="{Binding Form_MouseLeftButtonUpCommand}" PassEventArgsToCommand="True"/>
</i:EventTrigger>
</i:Interaction.Triggers>
我的理解是否正确?
那么,我们可以直接将RelayCommand
与EventTrigger
一起使用,而无需使用EventToCommand
吗?
感谢您的帮助!
答案 0 :(得分:4)
EventToCommand
是custom behavior。它首先由Expression blend小组提供,现在是WPF 4的一部分。如果你没有使用WPF4。您需要来自here的Blend SDK。
Behaviors将功能封装为可重用的组件。默认情况下不存在功能时使用这些功能。例如,对Label,Combobox等添加命令支持。
我们可以直接使用RelayCommand和EventTrigger,不需要使用EventToCommand吗?
没有。 RelayCommand
是避免代码缩减以定义自定义命令的快捷方式。它扩展了ICommand
,可以为Execute(T)
和CanExecute(T)
附加其代理。它类似于Prism库的DelegateCommand
。
<cmd:EventToCommand x:Uid="cmd:EventToCommand_1" Command="{Binding Form_MouseLeftButtonUpCommand}" PassEventArgsToCommand="True"/>
在上面的行cmd:EventToCommand
是底层控件的附加功能。 Form_MouseLeftButtonUpCommand
是它执行的Command
。此命令可以封装为RelayCommand
。
答案 1 :(得分:1)
感谢Tilak的有用答案。
根据Tilak的解释,我确实陷入困境,比如在事件处理程序中放置绑定(例如 Button GotFocus =“{Binding DoJob}”) - &gt;构建失败,发现像这样的事件处理程序不支持Binding。我们只能在Command中绑定(例如 Button Command =“{Binding DoJob}” /&gt;并且在这种情况下调用默认事件,使用button,它应该是Click事件)。 做一些愚蠢的事情会帮助我更多地了解生活 - LOL
我们可以直接使用RelayCommand和EventTrigger,不需要使用 EventToCommand?
实际上,我打算不使用EventToCommand,我找到了解决办法:使用InvokeCommandAction代替(属于System.Windows.Interactivity - Mvvm-light也指这个程序集)。