从后面的代码调用命令

所以我一直在四处搜寻,找不到如何做到这一点。 我正在创build一个使用MVVM的用户控件,并希望在“Loaded”事件上运行一个命令。 我意识到这需要一点点的代码,但我不能完全弄清楚需要什么。 该命令位于ViewModel中,它被设置为视图的datacontext,但我不确定如何路由这个,所以我可以从加载的事件后面的代码调用它。 基本上我想要的是这样的…

private void UserControl_Loaded(object sender, RoutedEventArgs e) { //Call command from viewmodel } 

环顾四周,我似乎无法find任何地方的语法。 我是否需要先绑定xaml中的命令才能引用它? 我注意到在用户控件中的命令绑定选项不会让你绑定的命令,因为你可以在像一个button的东西…

 <UserControl.CommandBindings> <CommandBinding Command="{Binding MyCommand}" /> <!-- Throws compile error --> </UserControl.CommandBindings> 

我确信有一个简单的方法来做到这一点,但我不能为我的生活弄清楚。

那么,如果DataContext已经设置,你可以投它并调用命令:

 var viewModel = (MyViewModel)DataContext; if (viewModel.MyCommand.CanExecute(null)) viewModel.MyCommand.Execute(null); 

(根据需要更改参数)

前言:在不了解你的需求的情况下,看起来像一个代码味道来执行加载后的代码隐藏命令。 必须有更好的方法,MVVM明智的。

但是,如果你真的需要在代码背后做这件事,这样的事情可能会起作用(注意:我目前无法testing):

 private void UserControl_Loaded(object sender, RoutedEventArgs e) { // Get the viewmodel from the DataContext MyViewModel vm = this.DataContext as MyViewModel; //Call command from viewmodel if ((vm != null) && (vm.MyCommand.CanExecute(null))) vm.MyCommand.Execute(null); } 

再次 – 尝试find更好的方法…

尝试这个:

 private void UserControl_Loaded(object sender, RoutedEventArgs e) { //Optional - first test if the DataContext is not a MyViewModel if( !this.DataContext is MyViewModel) return; //Optional - check the CanExecute if( !((MyViewModel) this.DataContext).MyCommand.CanExecute(null) ) return; //Execute the command ((MyViewModel) this.DataContext).MyCommand.Execute(null) } 

我有一个更紧凑的解决scheme,我想分享。 因为我经常在ViewModels中执行命令,所以我厌倦了写if语句。 所以我写了一个ICommand接口的扩展。

 using System.Windows.Input; namespace SharedViewModels.Helpers { public static class ICommandHelper { public static bool CheckBeginExecute(this ICommand command) { return CheckBeginExecuteCommand(command); } public static bool CheckBeginExecuteCommand(ICommand command) { var canExecute = false; lock (command) { canExecute = command.CanExecute(null); if (canExecute) { command.Execute(null); } } return canExecute; } } } 

这就是你将如何在代码中执行命令:

 ((MyViewModel)DataContext).MyCommand.CheckBeginExecute(); 

我希望这会加快你的发展多一点点。 🙂

PS不要忘记包含ICommandHelper的命名空间。 (在我的情况是SharedViewModels.Helpers)