与控件的所有子项共享上下文数据

时间:2009-08-04 16:54:09

标签: wpf mvvm prism

我需要一个观点的所有孩子都知道一段上下文信息(他们需要展示的人)。我还需要这种方法与MVVM兼容。我尝试在Prism应用程序中使用RegionContext执行此操作。这是我的方法和问题:

我有一个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);

期望能够使用附加属性从任何通过附加RegionManager.RegionContext的DependencyObject(ContactView.xaml)的子控件获取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。

我想我的问题确实是,您希望如何加载包含大量控件和区域的复杂视图并让它们共享一段上下文数据?

这样做的正确方法是什么? Scoped容器?编写一个新的附加属性,运行控件层次结构以查找RegionContext(ugh)?我没有正确使用RegionContext?我对任何事都持开放态度。建议远离。

1 个答案:

答案 0 :(得分:3)

更好的设计避免了完全使用RegionContext。这是一种穷人的依赖注入,因为它只能容纳一个对象。使用注入联系人的范围Unity容器可以提高ViewModel的可测试性,并避免在RegionContext中需要两个项目时不可避免的冲突。

相关问题