如何在视图中切换视图?
我正在制作一个使用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(); }
我通常这样做的另一种方式是通过ShellViewModel
或ApplicationViewModel
来处理我的所有窗口管理。 此方法使用DataTemplates
定义每个屏幕,并使用ContentControl
作为ShellView
或ApplicationView
当前屏幕的占位符。
我通常将它与某种类型的事件系统结合起来,比如Microsoft Prism的EventAggregator
,因此它可以侦听特定类型的消息,例如OpenWindow
或CloseWindow
消息。 如果您有兴趣,我有一篇关于ViewModel之间的通信的博客文章,可以让您更好地了解事件系统的外观。
例如,我的ShellViewModel
可能首先显示一个LoginViewModel
(一个DataTemplate
用于告诉WPF使用LoginViewModel
绘制LoginView
),它会订阅接收SuccessfulLogin
类型的消息。 一旦LoginViewModel
广播SuccessfulLogin
消息, ShellViewModel
将关闭LoginViewModel
并将其替换为ApplicationViewModel
。 您可以在我的MVVM导航文章中看到这样的示例
将您的视图放在Page
元素内,在MainWindow
创建一个Frame并将它的源指向您的第一页。
从那时起,您可以使用框架的NavigationService
将框架NavigationService
到另一个视图,就像Web浏览器一样。