【问题标题】:How do I control a WPF 4.5 Ribbons contextual tab visibility by availability of a particular control within a Prism (+ MEF) view using MVVM?如何通过使用 MVVM 的 Prism (+ MEF) 视图中的特定控件的可用性来控制 WPF 4.5 Ribbons 上下文选项卡的可见性?
【发布时间】: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 仍然可见,我希望上下文网格工具功能区选项卡也保持可见。

【问题讨论】:

    标签: c# wpf mvvm prism ribbon


    【解决方案1】:

    一种可能的解决方案如下:

    考虑到 Region 是在 ContentControl 上定义的,您可以向 Region 询问 ActiveViews,在这种情况下会有只有一个,即唯一显示的 Active View

    因此,您不需要 Focus/LostFocus 事件。 Region 会在您每次导航到不同的 TabView 时更新其 ActiveViews 列表。

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

    希望这对您有所帮助,问候。

    【讨论】:

    • 谢谢,看起来确实是这样。我没有意识到 ActiveViews 集合以这种方式响应。很大的帮助,再次感谢。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2018-03-23
    • 2011-08-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-17
    相关资源
    最近更新 更多