Делитесь контекстными данными со всеми дочерними элементами элемента управления - PullRequest
4 голосов
/ 04 августа 2009

Мне нужно, чтобы все дети представления знали фрагмент контекстуальной информации (человека, которого они должны показать). Мне также нужен подход, чтобы быть совместимым с MVVM. Я пытался сделать это с RegionContext в моем приложении Prism. Вот мой подход и проблемы:

У меня есть TabControl, который я использую View Injection для заполнения представлений, чтобы я мог заполнить RegionContext:

Из Shell.xaml:

<TabControl DockPanel.Dock="Right" cal:RegionManager.RegionName="TabRegion">

А вот и мой укол

//Create an instance of ContactView.xaml
contactView = CreateContactView(contact);
_regionManager.Regions["TabRegion"].Add(contactView, contactKey, true);

//"contact" being a simple entity of type Contact
RegionManager.SetRegionContext(contactViewb, contact);

То, что я ожидал , было в состоянии использовать присоединенное свойство для получения значения RegionContext из любого элемента управления, который является дочерним элементом этого DependencyObject (ContactView.xaml) через присоединенное свойство RegionManager.RegionContext :

Из ContactView.xaml

<TextBlock Text="{Binding 
     RelativeSource={RelativeSource Self}, 
     Path=(cal:RegionManager.RegionContext)}"/>

Но это не работает ... Мне нужно найти ContactView.xaml, чтобы заставить его работать:

<TextBlock Text="{Binding 
     RelativeSource={RelativeSource 
          Mode=FindAncestor, 
          AncestorType={x:Type views:ContactView}}, 
     Path=(cal:RegionManager.RegionContext)}"/>

Это нормально, однако я собираюсь позволить модулям загружать представления в ContactView, и я бы предпочел, чтобы они ничего не знали о ContactView.

Полагаю, мой вопрос на самом деле таков: Как вы ожидаете загрузить сложное представление с большим количеством элементов управления и областей и сделать так, чтобы все они совместно использовали один фрагмент контекстных данных?

Как правильно это сделать? Контейнер с областью действия? Написать новое вложенное свойство, которое запускает иерархию элементов управления для поиска RegionContext (тьфу)? Я не использую RegionContext правильно? Я открыт для всего. Предложить подальше.

1 Ответ

3 голосов
/ 05 августа 2009

Лучший дизайн позволяет вообще не использовать RegionContext. Это своего рода инъекция зависимости бедного человека в том, что она может содержать только один объект. Использование контейнера Unity с заданной областью, в который вы вводите контакт, приведет к лучшей тестируемости ViewModel и позволит избежать неизбежного конфликта при необходимости двух элементов в RegionContext.

...