使用ViewModel和内置的WPF命令

4

好的,我正在尝试掌握WPF命令的概念。它们似乎很简单,直到你尝试将命令转发到不是XAML代码后面的内容。我已经看到了使用自定义命令进行此操作的几种方法,但没有直截了当地解释如何使用内置的WPF命令来完成此操作,像“打开”,“保存”,“剪切”等。

是否有一种简单的方法,使用RelayCommand类或其他方法,将“打开”命令转发到我的ViewModel?

4个回答

6
WPF内置的ApplicationCommands等命令最初并没有考虑MVVM,因此当您尝试将它们放入ViewModel中时,它们并不完全匹配。
在WPF 4中,现在可以将InputCommands绑定到您的ViewModel:

https://www.thomaslevesque.com/2009/10/26/vs2010-binding-support-in-inputbindings/

一种替代方法是使用DelegateCommands,您可以自己实现或从类似Prism的库中获取。您可以在视图模型中定义DelegateCommand对象,并从视图中绑定它。
一旦绑定工作正常,您就可以在视图模型代码中定义命令执行的操作。

我猜使用这两个中的任何一个都不会免费提供键绑定。 - s73v3r
我相信你可以将KeyBinding绑定到视图模型中的命令,但说实话,我只使用过DelegateCommand,所以无法给你提供更完整的示例。 - sourcenouveau
更新的链接:https://www.thomaslevesque.com/2009/10/26/vs2010-binding-support-in-inputbindings/ - simonalexander2005

3
如果你正在使用 WPF 进行 MVVM,我强烈建议你考虑使用一个框架来帮助你,例如:
  1. Prism(提供自己的 DelegateCommand)
  2. MVVM Light Toolkit(提供自己的 RelayCommand)
  3. Caliburn.Micro(我最喜欢的,提供 Actions)

1

一种方法是使用附加属性,允许您的ViewModel在视图上定义CommandBindings。有关详细信息,请查看我的博客文章:

MVVM中的CommandBindings


0
假设您的ViewModel公开了一个New命令。您可以使用以下代码将Application.New命令绑定到VM。在XAML中:
<Window.CommandBindings>
    <CommandBinding Command="New" />
    ...
</Window.CommandBindings>

然后在代码中,您可以这样做。 (我喜欢将代码放在实用程序类中,而不是代码后面。)

foreach (CommandBinding cb in CommandBindings)
{
    switch (((RoutedUICommand)cb.Command).Name)
    {
        case "New":
            cb.Executed += (sender, e) => ViewModel.New.Execute(e);
            cb.CanExecute += (sender, e) => e.CanExecute = ViewModel.New.CanExecute(e);
            break;
    }
}

匿名方法在RoutedUICommand和ICommand之间提供了一个thunk。
编辑:另外,最佳实践是使用CommandManager显式设置命令绑定,而不是添加处理程序。
CommandManager.RegisterClassCommandBinding(typeof(MainWindow),
    new CommandBinding(ApplicationCommands.New,
        (sender, e) => ViewModel.NewScore.Execute(e),
        (sender, e) => e.CanExecute = ViewModel.NewScore.CanExecute(e)));

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接