将事件绑定到视图模型中的命令

本文关键字:命令 模型 视图 事件 绑定 | 更新日期: 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,也有这样的行为