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

4
我需要一个视图的所有子级都知道一些上下文信息(他们需要展示的人)。我还需要这种方法与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);

我预期的是能够使用附加属性从任何作为该DependencyObject(ContactView.xaml)的子控件中获取RegionContext的值,方法是通过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
一个更好的设计避免使用RegionContext。这是一种类似于贫民版依赖注入的方式,因为它只能托管一个对象。使用作用域Unity容器,将联系人注入其中,可以提高ViewModel的可测试性,并避免需要两个项目时不可避免的冲突。

是的...我明白你的意思。我担心容器会成为数据的倾倒场,但它很可能是“环境”数据存放的最佳位置。 - Anderson Imes
还有...RegionContext到底有什么用?名称中的“Context”部分似乎有些误导。 - Anderson Imes
你能给我提供一个“Prism中Scoped Unity容器”的示例链接吗?我在谷歌上找不到。 - Stas BZ

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接