RelayCommand与EventToCommand

时间:2013-01-02 04:03:10

标签: c# wpf mvvm mvvm-light routed-commands

我对Mvvmlight中的RelayCommandEventToCommand感到困惑。 似乎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>

我的理解是否正确?

那么,我们可以直接将RelayCommandEventTrigger一起使用,而无需使用EventToCommand吗?

感谢您的帮助!

2 个答案:

答案 0 :(得分:4)

EventToCommandcustom 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也指这个程序集)。