我正在使用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();
}
我通常这样做的另一种方法是通过处理我所有窗口管理的
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上的文章中看到此示例