如何使用MVVM通过Prism (+ MEF)视图中特定控件的可用性来控制WPF 4.5 Ribbons上下文选项卡的可

本文关键字:WPF 控制 可用性 选项 上下文 Ribbons 控件 Prism 通过 MVVM 何使用 | 更新日期: 2023-09-27 18:04:22

我正在使用Prism 5与MEF, WPF 4.5和MVVM模式创建一个模块化桌面应用程序。

应用程序shell有一个Ribbon控件,包含一个应用程序菜单,一个home选项卡,显示可用模块的下拉列表,一个上下文选项卡组控件,用于在处理包含DataGrid (ContextualTabGroupHeader="Grid Tools")的视图所显示的数据时激活。Ribbon控件还有一个Prism区域(RibbonRegion),模块可以在其中添加自己的选项卡组。shell中唯一的其他控件是定义另一个Prism区域(MainRegion)的Content控件。

当一个模块被选中时,它可以选择性地提供加载到shell的丝带区域和/或MainRegion区域的视图。我使用在聚合目录配置期间读取的MEF [ExportMetaData]属性来管理此操作,例如:

[ExportMetadata("ModuleDisplayName", "Example #1")]
[ExportMetadata("MainMenuView", "ExampleModule.Views.ExampleMenuView")]
[ExportMetadata("MainView", "ExampleModule.Views.ExampleTabsView")]

加载到MainRegion中的模块视图可以是任何能够添加到内容控件中的内容——例如,它可以是一个包含Tab控件的用户控件,该Tab控件定义了另一个模块特定的Prism Region,模块可以在其中加载一个或多个包含视图的选项卡,以响应模块ribbon选项卡命令。大多数模块将有一个或多个视图,可以使用DataGrid控件显示数据,我想使一些工具(例如标记,排序,过滤,计算等)通常可用于包含在视图中的DataGrid,该视图具有视图模型数据上下文,实现了响应上下文选项卡命令的特定接口(例如IGridTools)。

问题:到目前为止,所有这一切都工作得很好:我可以激活不同的模块和导航视图,并在DataGrid控件中显示数据-但现在我遇到了我的问题:我如何使"网格工具"上下文选项卡可见/隐藏以响应DataGrid控件变得可用/不可用(假设继承的数据上下文或视图模型实现了所需的接口)?

我可以检测视图何时导航到/从,但在使用选项卡控件显示多个视图(可能或可能不全部包含数据网格)的模块的情况下,我还需要知道所选选项卡何时具有显示Ribbon上下文选项卡的必要条件。我见过使用IActiveAware的例子,但通常人们很乐意使用Focus/LostFocus事件来改变IsActive布尔属性。问题是包含DataGrid的视图可能有也可能没有其他可能集中的控件(就像主Ribbon控件一样),但是如果DataGrid仍然可见,我希望上下文网格工具Ribbon选项卡也保持可见。

如何使用MVVM通过Prism (+ MEF)视图中特定控件的可用性来控制WPF 4.5 Ribbons上下文选项卡的可

一个可能的解决方案是:

考虑到区域是在ContentControl上定义的,您可以向Region询问ActiveViews,在这种情况下只有一个,也就是说,唯一的ActiveView 正在显示。

因此,您不需要Focus/LostFocus事件。区域将负责更新其ActiveViews列表,每次您导航到不同的选项卡视图

最后,为了决定是否显示或隐藏GridTools,您应该评估区域的ActiveView是否包含Grid控件。您可以通过查看UserControl的Content属性来实现这一点。

我希望这对你有帮助,Regards