将视图从一个模块注入第二个模块中的另一个视图

时间:2011-04-29 21:07:41

标签: wpf view prism viewmodel

我需要一些帮助,找出如何使用Prism库将视图从一个模块注入另一个模块的另一个视图中。

我的Order模块中有一个CreateOrderView。此视图将注入Shell中的某个区域。现在我需要在这个CreateOrderView中显示一个PersonCardView。 PersonCardView是我的PhoneBookModule视图。

PersonCardView的视图模型在构造函数中使用Person参数,该参数包含视图将显示的数据。

在我的CreateOrderView中,如何定义“占位符”以“注入”此PersonCardView?我不认为在这里定义一个区域是合适的,因为它总是这个单一的视图,而不是别的。 如果两个视图在同一个模块中,我可以像这样包含它:

<PersonCardView DataContext="{Binding PersonCardViewModel}"/>

CreateOrderViewModel当然会包含一个名为PersonCardViewModel的属性,其中包含PersonCardView的viewmodel。

但是除非我在两个模块之间创建一个引用,否则我无法看到如何这样做,我想避免这种情况。

有什么想法吗?你是如何处理这个问题的?

1 个答案:

答案 0 :(得分:1)

我有两种选择,我可以看到。

您的第一个选项使用区域。一个控件区域很好:

<ContentControl RegionManager.Region="MyCrossModuleRegion" />

这样可以正常工作。两者之间不需要参考。

第二个选项是让使用其他模块视图的模块(我们称之为Consuming模块)为生成视图的其他模块提供服务(我们将将此称为生产模块,以便消耗模块可以获得这些视图的工厂。一个例子有望清楚地表明这一点。

//What the Consuming module will expose via the Container
public interface IPersonCardProviderRegistrationService
{
     void RegisterProvider(IPersonCardProvider provider);
}

//What the Producing module will implement and pass to the Consuming module via the above interface
public interface IPersonCardProvider
{
     //If you need some interactivity, this could be an interface,
     //but if it's readonly data and little to no activity, object
     //is a perfectly valid type here
     object GetPersonCardView(long personID);
}

通过这种方式,Consuming模块可以使用提供程序为您要显示的每个人获取视图。 Producing模块将通过RegisterProvider调用将提供程序传递给Consuming模块。在这种情况下,生产模块将在Consuming模块上具有ModuleDependency ,但唯一的程序集引用必须是其中包含这两个接口的第三个程序集(我们称之为这是一个“合同”集合,但这不是行业标准术语或任何东西。)