Мне нужно, чтобы все дети представления знали фрагмент контекстуальной информации (человека, которого они должны показать). Мне также нужен подход, чтобы быть совместимым с 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 правильно? Я открыт для всего. Предложить подальше.