如何在视图中切换视图

本文关键字:视图 | 更新日期: 2023-09-27 18:26:07

我正在制作一个使用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消息。如果你感兴趣,我有一篇关于ViewModels之间通信的博客文章,它应该能让你更好地了解事件系统的样子。

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

将视图放在Page元素中,在MainWindow中创建一个Frame,并将其源指向第一个页面。

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