将事件绑定到视图模型中的命令
本文关键字:命令 模型 视图 事件 绑定 | 更新日期: 2023-09-27 18:21:57
我刚刚开始编写自己的小型状态图编辑器。我希望它是MVVM模式。但是我在将事件绑定到视图模型中的命令时遇到了问题。
运行我的应用程序时,会出现InvalidCastException。
System.InvalidCastException:无法将"System.Reflection.RuntimeEventInfo"类型的对象强制转换为"System.Refraction.MethodInfo"类型。
我的xaml文件中有以下片段。
<UserControl.Resources>
<vm:StateViewModel x:Key="StateViewModel"/>
</UserControl.Resources>
<Grid DataContext="{StaticResource StateViewModel}">
<Rectangle MouseLeftButtonDown="{Binding Path=DragStartCommand}">
</Grid>
在StateViewModel中,我创建了ICommand属性。
private DelegateCommand _dragStartCommand;
public ICommand DragStartCommand
{
get
{
if (_dragStartCommand == null)
{
_dragStartCommand = new DelegateCommand(StartDragging);
}
return _dragStartCommand;
}
}
private void StartDragging(object obj)
{
// ...
}
DelegateCommand类看起来像下面的
public class DelegateCommand : ICommand
{
private readonly Predicate<object> _canExecute;
private readonly Action<object> _execute;
public event EventHandler CanExecuteChanged;
public DelegateCommand(Action<object> execute)
: this(execute, null)
{
}
public DelegateCommand(Action<object> execute, Predicate<object> canExecute)
{
_execute = execute;
_canExecute = canExecute;
}
public bool CanExecute(object parameter)
{
if (_canExecute == null)
{
return true;
}
return _canExecute(parameter);
}
public void Execute(object parameter)
{
_execute(parameter);
}
public void RaiseCanExecuteChanged()
{
if (CanExecuteChanged != null)
{
CanExecuteChanged(this, EventArgs.Empty);
}
}
}
我希望你能帮我解决这个问题。为了做到这一点,我很高兴知道如何将EventArgs传递给我的命令并使用它们。
您可以使用blend sdk 中的EventToCommand Behavior
xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"
<DataGrid>
<i:Interaction.Triggers>
<i:EventTrigger EventName="MouseDoubleClick">
<Commanding:EventToCommand Command="{Binding Path=OpenCommand}"
CommandParameter="{Binding YourParameterBindingGoesHereIfYouNeedIt}"/>
</i:EventTrigger>
</i:Interaction.Triggers>
或者你观察MVVMLight,也有这样的行为