8

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

4

3 回答 3

26

您可以EventTriggerSystem.Windows.Interactivity命名空间中使用,这是所谓的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 上的命令。

评论

为了阐明用法,这里有一个现实生活中的例子,包括 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。请注意如何使用命令的参数,在示例中使用DelegateCommand对象的通用版本,因为您在每个 MVVM 框架(有时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 的乐趣,这是值得的。

于 2013-01-02T15:40:15.537 回答
0

您可以使用附加的命令行为

=> http://geekswithblogs.net/HouseOfBilz/archive/2009/08/21/adventures-in-mvvm-ndash-generalized-command-behavior-attachments.aspx

于 2013-01-02T13:39:29.313 回答
0

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

于 2013-01-02T13:47:37.660 回答