MVVM Light中的EventToCommand问题

时间:2012-02-01 19:28:35

标签: c# wpf mvvm-light relaycommand

我有以下可视树,我试图通过EventToCommand发送命令。 视觉效果如下:

<Border Background="Gray" Grid.Row="0" Margin="2" VerticalAlignment="Bottom">
            <i:Interaction.Triggers>
                <i:EventTrigger EventName="MouseDown">
                    <cmd:EventToCommand  
                Command="{Binding ShowVideosCmd}" 
                PassEventArgsToCommand="True" 
                CommandParameter="{Binding Videos}">
                    </cmd:EventToCommand>

                </i:EventTrigger>
            </i:Interaction.Triggers>
 </Border>

单击附加命令的边框时,出现以下弹出错误:

  

“发生了'System.InvalidCastException'类型的未处理异常   在GalaSoft.MvvmLight.WPF4.dll

     

附加信息:无法投射类型的对象   键入'System.Windows.Input.MouseButtonEventArgs'   'System.Windows.DependencyObject'。 “

然后在viemModel中创建我的命令,如下所示:

 ShowVideosCmd = new RelayCommand<DependencyObject>(
     (dpObj) =>
            { 
                 messenger.Default.Send<string>("ShowVideos");
            },
     (dpObj) => true
 );

我做错了什么?

1 个答案:

答案 0 :(得分:4)

错误消息非常自我解释:在您RelayCommand<DependencyObject>中,您希望命令参数为DependencyObject,但您有MouseButtonEventArgs这是正常的,因为您已经订阅了MouseDown活动。

事件触发时EventToCommand会使用以下参数之一来执行命令:

  • 如果CommandParameter的值为 NOT null,则会将其用作参数,因此命令应如下所示:RelayCommand<typeOfTheSpecifiedCommandPameter>
  • 如果PassEventArgsToCommand='true' 的值 CommandParameternull它使用eventargs作为命令 参数。所以你需要将命令定义为 RelayCommand<MouseButtonEventArgs>
  • 如果PassEventArgsToCommand='false' CommandParameternull,则不执行命令。

注意:

因此,您需要为两种情况定义不同的命令。您需要使用RelayCommand<object>并检查参数类型。这就是为什么我认为同时使用PassEventArgsToCommandCommandParameter是不好的做法。

回到例外:

在您的情况下,接缝CommandParameter="{Binding Videos}"返回null,这就是您将MouseButtonEventArgs作为命令参数的原因。

要找出{Binding Videos}为空的原因,您可以在运行时检查VS中的“输出”窗口,查找绑定错误。