Как управлять видимостью контекстной вкладки ленты WPF 4.5 с помощью доступности определенного элемента управления в представлении Prism (+ MEF) с использованием MVVM?

1

Я создаю модульное настольное приложение, используя Prism 5 с MEF, WPF 4.5 и шаблоном MVVM.

В оболочке приложения есть элемент управления "Лента", содержащий меню приложения, вкладку "Главная", отображающую раскрывающийся список доступных модулей, элемент управления контекстной вкладкой, который должен быть активирован при работе с данными, отображаемыми представлениями, содержащими DataGrid (ContextualTabGroupHeader = "Сетки" "). Элемент управления лентой также имеет область Prism (RibbonRegion), в которую модули могут добавлять свои собственные группы вкладок. Единственный другой элемент управления в оболочке - это элемент управления Content, определяющий другой регион Prism (MainRegion).

Когда выбран модуль, он может дополнительно предоставлять представления для загрузки в области RibbonRegion и/или MainRegion оболочки. Я использую атрибуты MEF [ExportMetaData], прочитанные во время конфигурации агрегатного каталога, для управления этим, например:

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

Вид модуля, загруженный в MainRegion, может быть любым, что может быть добавлено в элемент управления контентом - он может, например, быть элементом управления пользователя, содержащим элемент управления Tab, определяющий другой областью Prism для конкретного модуля, в который модуль может загружать одну или несколько вкладок, содержащих представления в ответ на команды вкладки модуля ленты. Большинство модулей будут иметь 1 или более просмотров, которые могут отображать данные с помощью элемента управления DataGrid, и я хочу сделать ряд инструментов (например, тегирование, сортировка, фильтрация, вычисление и т.д.), Которые обычно доступны для DataGrids, содержащихся в представлении, которое имеет view model datacontext, который реализует конкретный интерфейс для ответа на контекстные команды вкладки (например, IGridTools).

Проблема: до сих пор все это работает очень хорошо: я могу активировать различные модули и просматривать виды и отображать данные в элементах управления DataGrid, но теперь я столкнулся с моей проблемой: как мне сделать контекстную вкладку "Grid Tools" видимой/скрытый в ответ на доступность/недоступность элемента управления DataGrid (предполагая, что унаследованная datacontext или модель представления реализует необходимый интерфейс)?

Я могу обнаружить, когда представление перемещается в/из, но в случае модуля с использованием элемента управления вкладкой для отображения нескольких представлений (которые могут содержать или не могут содержать все данные) мне также нужно знать, когда выбранная вкладка имеет реквизиты для отображения контекстной вкладки ленты. Я видел примеры использования IActiveAware, но, как правило, люди с удовольствием используют события Focus/LostFocus для изменения свойства IsActive Boolean. Проблема в том, что представление, содержащее DataGrid, может иметь или не иметь других элементов управления, которые могли бы сфокусироваться (как и основной элемент управления ленты), но если DataGrid все еще виден, я бы хотел, чтобы вкладка ленты контекстной сетки также оставалась видимой.

Теги:
wpf
mvvm
prism
ribbon

1 ответ

0
Лучший ответ

Одним из возможных решений может быть следующее:

Учитывая, что регион определен в ContentControl, вы можете задать регион для ActiveView, который в этом случае будет только один, то есть единственный активный просмотр, который отображается.

Поэтому вам не нужны события Focus/LostFocus. Регион будет следить за обновлением списка ActiveViews при каждом переходе к другой вкладке или представлению.

Наконец, чтобы решить, показывать или скрывать GridTools, вы должны оценить, содержит ли Region ActiveView элемент управления Grid или нет. Вы можете достичь этого, посмотрев свойство UserControl Content.

Надеюсь, это помогло вам, С уважением.

  • 0
    Спасибо, это выглядит так, как будто это путь. Я не понял, что коллекция ActiveViews отреагировала таким образом. Отличная помощь, еще раз спасибо.

Ещё вопросы

Сообщество Overcoder
Наверх
Меню