从Code Behind调用命令

Kev*_*lia 63 c# data-binding wpf xaml command

所以我一直在四处寻找并且无法确切地知道如何做到这一点.我正在使用MVVM创建用户控件,并希望在'Loaded'事件上运行命令.我意识到这需要一些代码,但我无法弄清楚需要什么.该命令位于ViewModel中,它被设置为视图的datacontext,但我不确定如何路由它,所以我可以从加载的事件后面的代码中调用它.基本上我想要的是这样的......

private void UserControl_Loaded(object sender, RoutedEventArgs e)
{
    //Call command from viewmodel
}
Run Code Online (Sandbox Code Playgroud)

环顾四周,我无法在任何地方找到这种语法.我是否需要先在xaml中绑定命令才能引用它?我注意到用户控件中的命令绑定选项不会让你像按钮那样绑定命令......

<UserControl.CommandBindings>
    <CommandBinding Command="{Binding MyCommand}" /> <!-- Throws compile error -->
</UserControl.CommandBindings>
Run Code Online (Sandbox Code Playgroud)

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

H.B*_*.B. 130

好吧,如果已经设置了DataContext,你可以投射它并调用命令:

var viewModel = (MyViewModel)DataContext;
if (viewModel.MyCommand.CanExecute(null))
    viewModel.MyCommand.Execute(null);
Run Code Online (Sandbox Code Playgroud)

(根据需要更改参数)

  • @Alain:我的序言中有一个注释,我认为人们可以在他们的情况下引入支票,但不能保证. (2认同)

Won*_*ane 5

前言:在不了解您的要求的情况下,在加载时从代码隐藏执行命令似乎是一种代码味道.MVVM方面必须有更好的方法.

但是,如果你真的需要在代码中执行它,那么这样的东西可能会起作用(注意:我现在无法测试这个):

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);
} 
Run Code Online (Sandbox Code Playgroud)

再次 - 尝试找到更好的方法......

  • 在搜索该主题时,确实没有任何简单的方法,我所看到的普遍共识是背后的一点代码从未杀死任何人。 (2认同)
  • @KDiTraglia - 是的,但一般来说,“背后的小代码”通常是指仅影响视图本身的操作(即,当文本框中获得焦点时选择所有文本)。在这里,您从 View 的代码隐藏中直接与 ViewModel 交互,这违反了 MVVM 原则。 (2认同)