【发布时间】:2014-05-21 15:14:17
【问题描述】:
我正在使用带有 MEF、WPF 4.5 和 MVVM 模式的 Prism 5 创建一个模块化桌面应用程序。
应用程序外壳有一个功能区控件,其中包含一个应用程序菜单、一个显示可用模块下拉列表的主页选项卡、一个上下文选项卡组控件,用于在处理包含 DataGrid 的视图显示的数据时激活 (ContextualTabGroupHeader= “网格工具”)。 Ribbon 控件还有一个棱镜区域(RibbonRegion),模块可以在其中添加自己的选项卡组。 shell 中唯一的其他控件是定义另一个 Prism 区域 (MainRegion) 的内容控件。
当一个模块被选中时,它可以选择提供视图以加载到 shell 的 RibbonRegion 和/或 MainRegion 区域。我使用在聚合目录配置期间读取的 MEF [ExportMetaData] 属性来管理它,例如:
[ExportMetadata("ModuleDisplayName", "Example #1")]
[ExportMetadata("MainMenuView", "ExampleModule.Views.ExampleMenuView")]
[ExportMetadata("MainView", "ExampleModule.Views.ExampleTabsView")]
加载到 MainRegion 中的模块视图可以是任何能够添加到内容控件的内容 - 例如,它可以是包含 Tab 控件的用户控件,该控件定义了另一个模块特定的 Prism 区域,该模块可以在其中加载一个或包含响应模块功能区选项卡命令的视图的更多选项卡。 大多数模块将有 1 个或多个视图,可以使用 DataGrid 控件显示数据,我想制作一些工具(例如标记、排序、过滤、计算等),这些工具通常可用于包含在视图中的 DataGrids查看模型数据上下文,它实现了一个特定的接口来响应上下文选项卡命令(例如 IGridTools)。
问题:到目前为止,所有这些都运行良好:我可以激活不同的模块并导航视图并在 DataGrid 控件中显示数据 - 但现在我遇到了我的问题:如何制作“网格工具”上下文选项卡可见/隐藏以响应 DataGrid 控件变得可用/不可用(假设继承的数据上下文或视图模型当然实现了所需的接口)?
我可以检测何时导航到/从视图,但在模块使用选项卡控件显示多个视图(可能包含也可能不包含数据网格)的情况下,我还需要知道何时选择选项卡具有显示功能区上下文选项卡的必要条件。我见过使用 IActiveAware 的示例,但通常人们乐于使用 Focus/LostFocus 事件来更改 IsActive 布尔属性。问题在于,包含 DataGrid 的视图可能有也可能没有其他可能获得焦点的控件(主 Ribbon 控件也可能如此),但如果 DataGrid 仍然可见,我希望上下文网格工具功能区选项卡也保持可见。
【问题讨论】: