如何为特定按钮事件触发ViewModel命令

时间:2013-01-02 13:20:27

标签: wpf button mvvm command mouseevent

如何通过按钮的特定事件调用ViewModel上的命令,例如MouseDoubleClick

3 个答案:

答案 0 :(得分:22)

您可以使用 System.Windows.Interactivity 命名空间中的EventTrigger,该命名空间是所谓的 Prism 框架的一部分。如果您刚刚开始使用MVVM,那么现在不要过多关注Prism,但请记住以后再考虑。无论如何,你可以加强EventTrigger

它的工作原理如下:

引用程序集 System.Windows.Interactivity.dll

在XAML中,引用命名空间:

xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

然后在Button或任何其他控件中添加一个EventTrigger,如下所示:

<Button Content="Button">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction Command="{Binding CommandToBindTo}" 
                                CommandParameter="{Binding CommandParameterToBindTo}" />
      </i:EventTrigger>
   </i:Interaction.Triggers>
</Button>

这样,您就可以将事件绑定到DataContext上的 Command

<强>备注

为了澄清用法,这里有一种真实的例子,包括ViewModel。虚构的要求是允许用户选择列表中的项目,然后执行将所选项目作为参数的命令:

<ListBox x:Name="ItemsList" ItemsSource="{Binding Items}" />

<Button Content="Do something with selected item">
   <i:Interaction.Triggers>
      <i:EventTrigger EventName="MouseDoubleClick">
         <i:InvokeCommandAction Command="{Binding DoSomethingCommand}" 
                                CommandParameter="{Binding SelectedItem, 
                                                   ElementName=ItemsList}" />
      </i:EventTrigger>
   </i:Interaction.Triggers>
</Button>

这就是ViewModel。注意如何使用命令的参数,在每个MVVM框架(有时是DelegateCommand)中获得RelayCommand对象的通用版本的示例中。此类将所需参数的类型作为通用参数(此处为ItemViewModel),并且需要一个采用相应参数的方法(此处为ExecuteDoSomethingWithItem(ItemViewModel ...))。其余的是WPF魔术:CommandParameter属性绑定到XAML中的对象将作为Execute(...)函数中的参数传递。

public class ViewModel
{
    ObservableCollection<ItemViewModel> Items { get; set; }

    public ICommand DoSomethingCommand
    {
        get
        {
            return _doSomethingCommand ??
                   (_doSomethingCommand = new DelegateCommand<ItemViewModel>(ExecuteDoSomethingWithItem));
        }
    }

    private DelegateCommand<ItemViewModel> _doSomethingCommand;

    private void ExecuteDoSomethingWithItem(ItemViewModel itemToDoSomethingWith)
    {
        // Do something
    }

    public ViewModel()
    {
        Items = new ObservableCollection<ItemViewModel>();
        // Fill the collection
    }
}

学习MVVM玩得开心,值得。

答案 1 :(得分:0)

答案 2 :(得分:0)

如果要从开箱即用的WPF中使用命令和事件绑定,你需要自己做很多事情。只需使用已经提供命令甚至绑定的MVVM Light ToolkitCliburn Micro等现有框架,您就可以获得很多。