WPF MVVM应用中的高级导航

3
我正在开发一个基于WPF的MVVM应用程序,有一个关于最佳处理应用程序内视图导航的问题。具体来说,当我有多个视图可以导航时,我想知道最清晰的方法是什么。
让我总结一下我的当前应用程序布局,以便更好地解释问题。

上面的图显示了我的主壳体的大致布局。 主导航区是静态的,提供了许多按钮。 按钮存在于主要应用程序功能(例如状态、配置、诊断等)中。 当其中一个按钮被按下时,上下文导航区的内容被设置。 具体来说,这是通过将上下文导航区包含一个内容控件,并将Content属性绑定到类型为ViewModelBase的单个属性来实现的。 此外,视图模型和视图通过应用程序资源中的数据模板相互关联。
填充在上下文导航内容控件中的特定视图/视图模型然后提供与在主导航中选择的主要功能相关的其他导航选项。 当在上下文导航中选择选项时,主内容区域以与先前描述上下文导航相同的方式进行更新。
因此,我认为您可以将MainNavigationContextualNavigation区域的组合描述为非常类似于Outlook样式的菜单栏。 即底部的主要选择,顶部的次要选择,导致主内容区域的更改。
现在来说问题。我可以让它工作,但是它变得非常混乱!我有一个MainNavigationViewModel引起导航,还有多个上下文的ViewModels填充到ContextualNavigation区域导致导航。在某些情况下,主内容区域中的操作也可能导致需要导航。我实际上还有一个可能导致一些导航的Ribbon控件。所以我的ViewModels中到处都是导航,我不认为这是可维护的。顺便说一句,如果你想知道,我目前正在使用一个信使系统来允许视图模型之间的解耦通信。
我开始思考最好的方法是创建一个抽象服务,为应用程序中的所有视图模型处理导航,但不确定它会是什么样子。我这么做对吗?如果是这样,是否有人有任何关于应用程序范围导航服务的建议,可以处理来自多个视图模型的导航?

以我个人的意见,作为用户来说,主导航和上下文导航的结构让我感到困惑。我建议采用 Office 和 Windows 10 使用的只有一根带状菜单栏。 - Athafoud
为每个导航(主要和上下文)维护2个ViewModel列表。将这些列表可视化为某些控件(例如按钮列表),单击其中任何一个将使该ViewModel处于活动状态,并将其显示为内容。每个ViewModel都应该可以访问导航功能INavigate(例如INavigate.AddContextTarget()-在上下文导航中添加某些内容),您可以通过构造函数参数提供对它的访问。 - Sinatr
我建议您使用以前由微软开发并现在由社区维护的Prism MVVM框架,它为这种情况提供了区域管理器和导航服务。https://github.com/PrismLibrary - Tseng
1个回答

0

首先,你使用的是哪种MVVM方法?是先View还是先ViewModel?

正确的选择可以让你的生活更轻松。

你已经有的想法朝着正确的方向前进——接口和继承——抽象化导航层。

如果你已经在使用Messanger,那么它实际上遵循了类似的方法。在你的情况下,一个架构计划将是必不可少的,花些时间画出来吧。


在我看来,通过消息/事件进行导航有点痛苦,你无法对用户交互做出反应或者在当前活动的视图模型修改数据并且必须询问用户是否要保存/放弃更改或取消导航尝试以进行另一种更改和提交时取消导航。这在使用导航服务和实现INavigationAware接口的ViewModel(例如PrismLibrary)中非常有效,其中ViewModel可以在满足或不满足某些条件时取消导航尝试。 - Tseng

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接