Wpf 如何在MVVM项目中设计灵活的导航逻辑?

Wpf 如何在MVVM项目中设计灵活的导航逻辑?,wpf,mvvm,navigation,Wpf,Mvvm,Navigation,我正在使用MVVM模式设计一个项目,所以使用了WPF、绑定等 现在的问题是,对导航布局和逻辑的要求不断变化。 如今,导航逻辑是通过绑定在ViewModel中硬编码的。 我想知道,有没有一个好的设计模式可以让这变得容易 例如,在顶部有一个水平条作为第一级导航,然后在左侧有一个垂直手风琴控件作为第二级和第三级导航,在主区域有一些可折叠面板作为第四级导航 每当单击任何导航元素时,都会设置ViewModel属性,以便绑定触发视图刷新 我们的需求人员不断改变关于业务逻辑部分(将其视为用户控件)应如何位于第

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

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

例如,在顶部有一个水平条作为第一级导航,然后在左侧有一个垂直手风琴控件作为第二级和第三级导航,在主区域有一些可折叠面板作为第四级导航

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

我们的需求人员不断改变关于业务逻辑部分(将其视为用户控件)应如何位于第一、第二、第三或第四级的想法:昨天UserControlA可能位于可折叠面板内,因此它是第四级导航;今天,由于一些用户的请求,它可能被提升为第二级项目

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

有什么建议吗?代码示例非常受欢迎

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

  • 创建独立控件,这些控件互不了解,也不知道它们在布局中的最终位置。您可以创建UserControlA、UserControlB等及其相应的视图模型
  • 使用所选的EventAggregator/Mediator在VM之间进行通信。使用依赖项注入(MEF/Unity就是这么做的)将这些信息传递给VM
  • 您创建的主布局不包含任何具体控件,只包含称为区域的空白空间。它们由一个名称标识
  • 然后,在代码、xaml甚至配置文件中的某个地方,您通过说“名为a的区域需要UserControlA类型的控件”将所有内容链接在一起。现在,如果需求发生变化,您只需更改这一行,以便UserControlA现在进入区域AA。应用程序中的其他内容不会更改
它确实需要一些学习来适应它,但最终它是值得的。自从我开始使用棱镜,我就再也没有回头看