将事件绑定到viewmodel中的命令

时间:2014-09-15 10:17:34

标签: c# wpf mvvm binding command

我刚开始编写自己的小状态图表编辑器。我希望它是MVVM模式。 但是我遇到了将事件绑定到viewmodel中的命令的问题。

运行我的应用程序时,会出现此InvalidCastException。

  

System.InvalidCastException:无法将类型为“System.Reflection.RuntimeEventInfo”的对象强制转换为“System.Reflection.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传递给我的命令并使用它们。

1 个答案:

答案 0 :(得分:0)

您可以使用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还有这样的行为