我有以下可视树,我试图通过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
);
我做错了什么?
答案 0 :(得分:4)
错误消息非常自我解释:在您RelayCommand<DependencyObject>
中,您希望命令参数为DependencyObject
,但您有MouseButtonEventArgs
这是正常的,因为您已经订阅了MouseDown
活动。
事件触发时EventToCommand
会使用以下参数之一来执行命令:
CommandParameter
的值为 NOT null
,则会将其用作参数,因此命令应如下所示:RelayCommand<typeOfTheSpecifiedCommandPameter>
PassEventArgsToCommand='true'
和的值
CommandParameter
是null
它使用eventargs作为命令
参数。所以你需要将命令定义为
RelayCommand<MouseButtonEventArgs>
。 PassEventArgsToCommand='false'
和 CommandParameter
为null
,则不执行命令。注意:
因此,您需要为两种情况定义不同的命令。您需要使用RelayCommand<object>
并检查参数类型。这就是为什么我认为同时使用PassEventArgsToCommand
和CommandParameter
是不好的做法。
回到例外:
在您的情况下,接缝CommandParameter="{Binding Videos}"
返回null,这就是您将MouseButtonEventArgs
作为命令参数的原因。
要找出{Binding Videos}
为空的原因,您可以在运行时检查VS中的“输出”窗口,查找绑定错误。