如何在视图中切换视图?

ben*_*man 8 c# wpf mvvm mvvm-light

我正在制作一个使用MVVM光框架的WPF应用程序.

我要做的是在视图中有一个登录表单,当用户按下该视图中的按钮时,它会为附加的ViewModel启动LoginCommand.从那里我想要启动一个新窗口来保存应用程序的其余部分,或者只是从同一个窗口切换视图.

目前我有它,所以有一个名为MainView的视图,其内部控件内部绑定到View1.但是,要切换到View2,我需要在MainView上放置此按钮,而不是在它所属的View1中.

有什么建议?

Rac*_*hel 8

通常我会这样做两种方式之一:

如果登录窗口是启动应用程序之前需要的一次性事物,我将把它放在对象的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();
}
Run Code Online (Sandbox Code Playgroud)

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

我通常与某种形式的,如微软棱镜的的事件系统结合本EventAggregator,所以它可以侦听特定类型的消息,如OpenWindowCloseWindow消息.如果您有兴趣,我有一篇关于ViewModel之间的沟通的博客文章 ,可以让您更好地了解事件系统的外观.

例如,我ShellViewModel可以通过显示启动LoginViewModel(一个DataTemplate是用来告诉WPF绘制LoginViewModelLoginView),它会订阅接收类型的消息SuccessfulLogin.一旦LoginViewModel广播的SuccessfulLogin消息时,ShellViewModel将关闭LoginViewModel并用替换它ApplicationViewModel.您可以在我的MVVM导航文章中看到这样的示例