如何在视图中切换视图?

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

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

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

任何建议?

通常我这样做有以下两种方式:

如果登录窗口是启动应用程序之前所需的一次性事物,我将把它放在Application对象的OnStartup()方法中

 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消息。 如果您有兴趣,我有一篇关于ViewModel之间的通信的博客文章,可以让您更好地了解事件系统的外观。

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

将您的视图放在Page元素内,在MainWindow创建一个Frame并将它的源指向您的第一页。

从那时起,您可以使用框架的NavigationService将框架NavigationService到另一个视图,就像Web浏览器一样。