从后面的代码调用命令
所以我一直在四处搜寻,找不到如何做到这一点。 我正在创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)