我正在制作一个使用MVVM灯架的WPF应用程序。
我要做的是在视图中有一个登录表单,当用户按下该视图中的按钮时,它会为附加的ViewModel启动LoginCommand。从那里我想要启动一个新窗口来保存应用程序的其余部分,或者只是从同一个窗口切换视图。
目前我有它,所以有一个名为MainView的视图,其内部控件内部绑定到View1。但是,要切换到View2,我需要在MainView上放置此按钮,而不是在它所属的View1中。
有什么建议吗?
答案 0 :(得分: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();
}
我通常这样做的另一种方式是通过ShellViewModel
或ApplicationViewModel
来处理我的所有窗口管理。此方法使用DataTemplates
定义每个屏幕,并使用ContentControl
作为ShellView
或ApplicationView
中当前屏幕的占位符。
我通常将此与某种类型的事件系统(如Microsoft Prism的EventAggregator
)结合使用,因此它可以侦听特定类型的消息,例如OpenWindow
或CloseWindow
消息。如果您有兴趣,我有一篇关于Communication between ViewModels的博客文章,可以让您更好地了解事件系统的外观。
例如,我的ShellViewModel
可能首先显示LoginViewModel
(DataTemplate
用于告诉WPF使用LoginViewModel
绘制LoginView
) ,它会订阅接收SuccessfulLogin
类型的消息。在LoginViewModel
广播SuccessfulLogin
消息后,ShellViewModel
将关闭LoginViewModel
并将其替换为ApplicationViewModel
。您可以在Navigation with MVVM
答案 1 :(得分:3)
将您的观点放在Page
元素内,MainWindow
创建一个框架,并将其指向第一页。
从那时起,您可以使用框架的NavigationService
将您的框架导航到另一个视图,就像网络浏览器一样。