好的,我正在尝试掌握WPF命令的概念。它们似乎很简单,直到你尝试将命令转发到不是XAML代码后面的内容。我已经看到了使用自定义命令进行此操作的几种方法,但没有直截了当地解释如何使用内置的WPF命令来完成此操作,像“打开”,“保存”,“剪切”等。
是否有一种简单的方法,使用RelayCommand类或其他方法,将“打开”命令转发到我的ViewModel?
ApplicationCommands
等命令最初并没有考虑MVVM,因此当您尝试将它们放入ViewModel中时,它们并不完全匹配。InputCommands
绑定到您的ViewModel:
https://www.thomaslevesque.com/2009/10/26/vs2010-binding-support-in-inputbindings/
一种替代方法是使用DelegateCommands
,您可以自己实现或从类似Prism的库中获取。您可以在视图模型中定义DelegateCommand
对象,并从视图中绑定它。一种方法是使用附加属性,允许您的ViewModel在视图上定义CommandBindings。有关详细信息,请查看我的博客文章:
<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;
}
}
CommandManager.RegisterClassCommandBinding(typeof(MainWindow),
new CommandBinding(ApplicationCommands.New,
(sender, e) => ViewModel.NewScore.Execute(e),
(sender, e) => e.CanExecute = ViewModel.NewScore.CanExecute(e)));
KeyBinding
绑定到视图模型中的命令,但说实话,我只使用过DelegateCommand
,所以无法给你提供更完整的示例。 - sourcenouveau