【问题标题】:How to design a flexible navigation logic in a MVVM project?如何在 MVVM 项目中设计灵活的导航逻辑?
【发布时间】:2011-12-05 04:46:05
【问题描述】:

我正在使用MVVM模式设计一个项目,所以使用了WPF,绑定等。

现在的问题是,导航布局和逻辑的要求不断变化。 今天,导航逻辑通过绑定硬编码在 ViewModel 中。 我想知道,有没有好的设计模式可以让这变得简单?

例如,顶部有一个水平栏作为 1 级导航,左侧有一个垂直 Accordion 控件作为 2 级和 3 级导航,主区域有一些 CollapsiblePanel 作为 4 级导航。

每当单击任何导航元素时,都会设置一个 ViewModel 属性,以便绑定触发视图刷新。

我们的需求人员不断改变关于业务逻辑部分(将其作为用户控件)应如何位于第 1、第 2、第 3 或第 4 层的想法:昨天 UserControlA 可能在 CollapsiblePanel 内,所以它是第 4 层导航;今天,由于一些用户的要求,它可能会被提升为二级物品。

我不会责怪需求工程师,因为它应该可以在 MVVM 项目中设计一个精致的导航框架,使 GUI 布局更改变得容易,甚至是可配置的。

有什么建议吗?欢迎提供代码示例!

【问题讨论】:

    标签: wpf mvvm navigation


    【解决方案1】:

    您应该结合 MEF 或 Unity 查看 Prism。它们一起允许您编写听起来正是您正在寻找的模块化应用程序。基本上你会做的是

    • 创建独立的控件,它们彼此之间一无所知,也不知道它们在布局中的最终位置。您创建 UserControlA、UserControlB 等及其对应的视图模型。
    • 使用所选的 EventAggregator/Mediator 在 VM 之间进行通信。这些使用依赖注入(MEF/Unity 所做的)交给虚拟机
    • 您创建的主布局不包含任何具体控件,仅包含称为区域的空白区域。这些由名称标识。
    • 然后,在代码、xaml 甚至配置文件的某个位置,您可以通过说“名称为 A 的区域需要 UserControlA 类型的控件”将所有内容链接在一起。现在,如果需求发生变化,您只需更改单行,以便 UserControlA 现在进入区域 AA。应用程序中的其他内容没有任何变化。

    这确实需要一些学习来适应它,但最终它是值得的。自从我开始使用 Prism 以来,我从未回头。

    【讨论】:

      猜你喜欢
      • 2011-07-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-08-09
      • 1970-01-01
      • 2019-05-28
      • 1970-01-01
      • 2012-04-14
      相关资源
      最近更新 更多