我正在使用MVVM light框架制作WPF应用程序。

我想做的是在 View 中有一个登录表单,当用户在该 View 中按下按钮时,它将为附加的ViewModel启动LoginCommand。从那里,我要么想要启动一个包含应用程序其余部分的新窗口,要么只是从同一窗口切换 View 。

目前,我拥有一个名为MainView的 View ,该 View 内部具有绑定(bind)到View1的内容控件。但是,要切换到View2,我需要将其按钮放在MainView上,而不是放在它所属的View1内。

有什么建议吗?

最佳答案

通常,我会通过以下两种方式之一执行此操作:

如果启动应用程序之前需要一次登录窗口,则将其放置在OnStartup()对象的Application方法中

protected override void OnStartup(StartupEventArgs e)
{
    base.OnStartup(e);

    // Login
    var login = new LoginDialog();
    var loginVm = new LoginViewModel();

    login.DataContext = loginVm;
    login.ShowDialog();

    if (!login.DialogResult.GetValueOrDefault())
    {
        // Error is handled in login class, not here
        Environment.Exit(0);
    }

    // If login is successful, show main application
    var app = new ShellView();
    var appModel = new ShellViewModel();

    app.DataContext = viewModel;
    app.Show();
}

我通常这样做的另一种方法是通过处理我所有窗口管理的ShellViewModelApplicationViewModel。此方法使用DataTemplates定义每个屏幕,并使用ContentControl作为ShellViewApplicationView中当前屏幕的占位符。

我通常将其与某种事件系统(例如Microsoft Prism的EventAggregator)结合使用,以便它可以监听特定类型的消息,例如OpenWindowCloseWindow消息。如果您有兴趣,我在博客上发布了有关Communication between ViewModels的文章,该文章应该可以使您更好地了解事件系统的外观。

例如,我的ShellViewModel可能首先显示一个LoginViewModel(一个DataTemplate用于告诉WPF用LoginViewModel绘制LoginView),并且它将订阅接收SuccessfulLogin类型的消息。 LoginViewModel广播了SuccessfulLogin消息后,ShellViewModel将关闭LoginViewModel并将其替换为ApplicationViewModel。您可以在Navigation with MVVM上的文章中看到此示例

10-04 12:34