如何在启动时使用relay命令,如果我想传递的方法在另一个类中,我该怎么做

时间:2015-09-02 06:25:01

标签: c# wpf mvvm

我有兴趣了解有关MVVM的更多信息。我看了一下MVVM演示应用程序。我理解它背后的许多主要概念。

当我开始使用该应用时,我想在应用启动时默认打开其中一个标签视图。但是我不确定如何做到这一点。

在应用程序中,我想我明白当单击控制面板按钮(例如,查看所有客户)时,commandrelay会创建一个新的AllCustomersViewModel,并且数据模板将视图应用于viewmodel,新的工作空间将创建到由于主窗口中的数据绑定,工作区集合和选项卡打开。

除了点击超链接之外,我不知道如何启动此过程。我知道我需要拨打new RelayCommand(param => this.ShowAllCustomers()),但我不知道如何在没有任何用户互动的情况下调用此方法,或者如何从主窗口视图模型外部调用它,例如从应用程序的onstartup方法。

有人可以建议在启动应用程序时使用relaycommand的最佳方法吗?另外,如果我想要传递的方法在另一个类中,如何使用relay命令?

VMaleev正确地给了我一个调用命令的方法,但是提供的示例特定于命令集合。如果我有一个方法Public ICommand HelpPageCommand根据ShowHelpPage所在的ShowHelpPage方法创建一个新命令,该怎么办?

HelpViewModel workspace = new HelpViewModel();
this.Workspaces.Add(workspace);
this.SetActiveWorkspace(workspace);

那我怎么称呼这个命令呢? - 简单,如果方法是ICommand,那么只需method.execute(null)

1 个答案:

答案 0 :(得分:3)

我想,你在谈论this文章。

要在没有用户交互的情况下调用RelayCommand,您应该写:

  1. 如果想从MainWindowViewModel调用(例如,在构造函数中):

    _commands.FirstOrDefault(q => q.DisplayName == Strings.MainWindowViewModel_Command_ViewAllCustomers).Command.Execute(null);
    
  2. 如果想从App.xaml.cs调用(在应用程序启动时,代码是从示例中获取的,只添加了一行)或者您有权查看模型实例的其他地方:

    protected override void OnStartup(StartupEventArgs e)
    {
        base.OnStartup(e);
    
        MainWindow window = new MainWindow();
    
        // Create the ViewModel to which 
        // the main window binds.
        string path = "Data/customers.xml";
        var viewModel = new MainWindowViewModel(path);
    
        // When the ViewModel asks to be closed, 
        // close the window.
        EventHandler handler = null;
        handler = delegate
        {
            viewModel.RequestClose -= handler;
            window.Close();
        };
        viewModel.RequestClose += handler;
    
        // Allow all controls in the window to 
        // bind to the ViewModel by setting the 
        // DataContext, which propagates down 
        // the element tree.
        window.DataContext = viewModel;
    
        // the following line is added
        viewModel.Commands.FirstOrDefault(q => q.DisplayName == Strings.MainWindowViewModel_Command_ViewAllCustomers).Command.Execute(null);
    
        window.Show();
    }
    
  3. 如果要传递的方法在另一个类中,有两种方法可以执行:

    • 发布/订阅机制(通过使用c#事件)
    • 可以从视图模型的每个实例访问视图模型的所有实例。在这种情况下,您可以将视图模型的任何实例的方法作为RelayCommand
    • 的参数传递

    希望,这有帮助