WPF、MVVM和有效的导航/控制流程

本文关键字:导航 控制流 有效 MVVM WPF | 更新日期: 2023-09-27 17:59:28

我目前正在构建一个基于现实世界场景的应用程序,以帮助我学习和理解WPF和MVVM。为此,我阅读并完成了Karl Shifflett的"In The Box"VSIX,我能够将大多数概念适应我正在开发的应用程序

虽然我认为MVVM是一种强大的设计模式,但它确实(似乎)让曾经琐碎的事情(例如显示消息、导航、与多个窗口交互)变得不那么琐碎或简单。现在谈谈我问题的症结/困惑。

我正在开发的WPF应用程序是一个基于Windows的应用程序,并且我正在根据一组基本需求进行工作:

  • 基本登录屏幕
  • 成功登录后,关闭登录屏幕并打开实际应用程序
  • 模拟典型的程序工作流程(通过单击按钮打开"子"窗口,显示模式窗口等)
  • 预成型数据验证/错误处理
  • 注销

我习惯于在windows平台上使用MDI应用程序,在该平台上,父窗体上的交互会导致子窗体打开;我知道MDI不是WPF支持的东西,我可以从不同的角度来处理开发。不过,我的UI仍将以与MDI应用程序类似的方式工作:我有我的应用程序布局,当我与该布局交互时,我的应用软件将通过打开窗口、显示消息等方式进行响应。我不清楚(通过MVVM)如何与多个窗口交互,也不清楚MVVM如何扩展到具有多个窗口/视图的大型应用程序。

我并不反对使用类似Prism的东西,但我还没有找到一篇关于Prism如何很好地解决我的特定问题的好文章。非常感谢您的任何帮助、建议、反馈或其他方式!

WPF、MVVM和有效的导航/控制流程

您尝试过查看nRoute框架吗?

可以在此处找到链接

实际上有一些关于棱镜的好教程

链路1

链路2(链路1的第二部分)

链路3

对于更直接的forrward应用程序(不是很复杂和模块化),您可以始终创建一个应用程序,该应用程序具有管理子用户控件的主窗口(登录窗口、菜单窗口、其他窗口…)

例如,在窗口中创建一个内容呈现器,并在codebehind:中创建

public partial class ShellWindow: Window
{
    public enum PagesTypes { Login, Home }
    PagesTypes currentOpenedPage;
    LoginUserControl login;
    HomeUserControl home;
    public WindowController()
    {
        InitializeComponent();
        login = new LoginUserControl ();
        login.GoToPage += new LoginUserControl.ChangePageHandler(GoToPage);
        GoToPage(PagesTypes.Login);
    }
    public void GoToPage(PagesTypes page)
    {
        switch (page)
        {
            case PagesTypes.Login:
            //Close last opened usercontrol, 
            ....
            //open new usercontrol
            login = new LoginUserControl();
            contentpresenter.content = login;
            break;
            //other pages cases
            ....
        }
        currentOpenedPage = page;
    }
}

例如,登录用户控制:

public partial class LoginUserControl : UserControl
{
    internal delegate void ChangePageHandler(ShellWindow.PagesTypes toPage);
    internal event ChangePageHandler GoToPage;
    public LoginUserControl()
    {...}
    //Methods for login 
    .....
    internal void LoginOK()
    {
        if(this.GoToPage != null)
            GoToPage(ShellWindow.PagesTypes.Home);
    }
}

您可以使用这种方法来构建一个良好的动态-更改用户控件,模拟不同的窗口。

希望这能给你一些想法。

MVV实际上可以很容易地创建子窗口,尤其是当您决定使用选项卡式界面时。您的外部窗口的视图模型只是有一个ChildWindowViewModel的集合。您只需创建新的视图模型,并要求外部窗口将其添加到其集合中,就可以创建一个新的选项卡,WPF的DataTemplate将负责正确的显示。你必须做一些手脚才能让制表符的"关闭"操作按你想要的方式进行。这有点痛苦,但可行。

如果你真的想做MDI,WPF中没有任何内置的东西(我认为微软现在已经决定它是一个糟糕的UI模式了?),但可能有第三方控件可以支持它。任何好的控件都会镜像这个解决方案,他们的MDI容器控件将绑定到你的子窗口视图模型列表。