Каков хороший способ связать контроль ленты с Caliburn Micro? - PullRequest
2 голосов
/ 03 января 2012

Я использую Caliburn Micro для своего проекта, и я решил использовать Fluent Ribbon как часть пользовательского интерфейса.Мой ShellView действительно прост и выглядит следующим образом:

  • Управление лентой с 4 вкладками.
  • ActiveItem.

Активный элемент динамическиизменяется в зависимости от выбранной вкладки ленты.

Вопрос:

Как правильно использовать элемент управления ленты в качестве второго представления для моей активной в настоящий момент ViewModel (ActiveItem),сохраняя при этом модульность и все положительные качества, которые наследуются самим CM?Кроме того, что потребуется, чтобы «поделиться» моим элементом управления ленты между моими ViewModels?

Подробности:

Мой ShellViewModel имеет тип " Conductor.Collection.OneActive", и он изменяет ActiveItem на конкретную ViewModel, которую я связываю с выбранной вкладкой (при возникновении события).

Моя лента определяется в XAML следующим образом:

<ContentControl x:Name="RibbonBar" Micro:View.Model="{Binding ActiveItem}" Micro:View.Context="Ribbon" />

Как видно, элемент управления ленты привязан к текущему активному элементу как его контекстное представление.Это на самом деле работает для одного представления, потому что из-за соглашений CM по умолчанию, где оно ищет контекстные представления в подпространстве имен (например, если мой путь к представлению равен Views.TasksTabView , он будет искать контекстview в Views.TasksTab.Ribbon ).

Проблема в том, что при изменении ActiveItem контекстное представление больше не может быть расположено из-за другого пространства имен, поэтому оно работает только дляодна вкладка.

Я также пытался написать свое собственное соглашение ViewLocator, но у меня ничего не получилось.

Спасибо.

1 Ответ

2 голосов
/ 15 февраля 2012

К сожалению, поскольку ответов нет, я отвечу сам.

Мне удалось написать дополнительную логику ViewLocator для определения местоположения моей ленты, но это создало некоторые проблемы (кажется, что привязка в CM работает только один раз, поэтому после того, как лента была привязана к виртуальной машине, дополнительные изменения представления контекста ничего не делают . Также было трудно найти ошибки).

Тогда я выбрал другой подход. Я разделил Ribbon на его собственную ViewModel и скомпоновал его в оболочку с остальными модулями. Он использует EventAggregator, и я также вставляю его, где это необходимо. Не подход, на который я надеялся, но пока он работает.

Если кто-то напишет лучший ответ, я обязательно приму его.

...