如何在视图中切换视图?

时间:2012-02-28 20:06:11

标签: c# wpf mvvm mvvm-light

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

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

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

有什么建议吗?

2 个答案:

答案 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();
}

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

我通常将此与某种类型的事件系统(如Microsoft Prism的EventAggregator)结合使用,因此它可以侦听特定类型的消息,例如OpenWindowCloseWindow消息。如果您有兴趣,我有一篇关于Communication between ViewModels的博客文章,可以让您更好地了解事件系统的外观。

例如,我的ShellViewModel可能首先显示LoginViewModelDataTemplate用于告诉WPF使用LoginViewModel绘制LoginView) ,它会订阅接收SuccessfulLogin类型的消息。在LoginViewModel广播SuccessfulLogin消息后,ShellViewModel将关闭LoginViewModel并将其替换为ApplicationViewModel。您可以在Navigation with MVVM

的文章中看到相关示例

答案 1 :(得分:3)

将您的观点放在Page元素内,MainWindow创建一个框架,并将其指向第一页。

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