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

时间:2014-04-23 14:46:07

标签: c# wpf mvvm prism

我目前正在构建基于真实场景的应用程序,以帮助我学习和理解WPF和MVVM。为此,我通过Karl Shifflett的"In The Box" VSIX阅读并完成了工作,并且我能够将大部分概念应用到我正在处理的应用程序中。

虽然我认为MVVM是一种功能强大的设计模式,但它(看似)确实(通常会显示消息,导航,与多个窗口交互),而不是那么简单或直接。现在我的问题/困惑的关键。

我正在处理的WPF应用程序是基于Windows的应用程序,我正在从一组基本要求开始工作:

  • 基本登录屏幕
  • 成功登录后,关闭登录屏幕并打开实际应用程序
  • 模拟典型的程序工作流程(通过按钮点击打开“子”窗口,显示模态窗口等)。
  • 预制件数据验证/错误处理
  • 退出

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

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

3 个答案:

答案 0 :(得分:0)

您是否尝试过查看nRoute框架?

可以找到here

链接

答案 1 :(得分:0)

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

Link 1

Link 2 (Part II of Link1)

Link 3

对于更直接的forrward应用程序(不是非常复杂和模块化),您始终可以创建一个应用程序,其中包含一个管理子用户控件的主窗口(登录窗口,菜单窗口,其他窗口......)

例如,在其中创建一个contentpresenter窗口,并在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;

    }

}

例如登录usercontrol:

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);
    }
}

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

希望这会给你一些想法。

答案 2 :(得分:0)

实际上MVVM你的子窗口实际上很容易,特别是如果你认为选项卡式界面没问题。您的外部窗口的视图模型只有一个ChildWindowViewModel的集合。您只需创建一个新的视图模型,创建一个新的视图,要求外部窗口将其添加到它的集合中,WPF的DataTemplate真棒将负责正确的显示。您将不得不做一些摆弄以使标签'关闭'操作以您想要的方式工作。这是一种痛苦,但可行。

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