我需要所有观点的 child 都知道一段上下文信息(他们需要显示的人)。我还需要与MVVM兼容的方法。我试图在我的Prism应用程序中使用RegionContext做到这一点。这是我的方法和问题:

我有一个TabControl,使用View Injection填充 View ,以便可以填充RegionContext:

从Shell.xaml:

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

这是我的注入(inject)
//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)}"/>

很好,但是我将允许模块将 View 加载到ContactView中,并且我希望它们不必对ContactView有所了解。

我想我的问题确实是,您如何期望加载带有许多控件和区域的复杂 View 并使它们全部共享一个上下文数据?

什么是正确的方法?范围内的容器?编写一个新的附加属性,该属性运行控件层次结构以查找RegionContext(ugh)?我没有正确使用RegionContext吗?我对任何事情都开放。建议离开。

最佳答案

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

10-04 10:03