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);

期望能够使用附加属性通过 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 的信息。

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

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

4

1 回答 1

3

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

于 2009-08-05T02:56:27.487 回答