我需要一些帮助,找出如何使用Prism库将视图从一个模块注入另一个模块的另一个视图中。
我的Order模块中有一个CreateOrderView。此视图将注入Shell中的某个区域。现在我需要在这个CreateOrderView中显示一个PersonCardView。 PersonCardView是我的PhoneBookModule视图。
PersonCardView的视图模型在构造函数中使用Person参数,该参数包含视图将显示的数据。
在我的CreateOrderView中,如何定义“占位符”以“注入”此PersonCardView?我不认为在这里定义一个区域是合适的,因为它总是这个单一的视图,而不是别的。 如果两个视图在同一个模块中,我可以像这样包含它:
<PersonCardView DataContext="{Binding PersonCardViewModel}"/>
CreateOrderViewModel当然会包含一个名为PersonCardViewModel的属性,其中包含PersonCardView的viewmodel。
但是除非我在两个模块之间创建一个引用,否则我无法看到如何这样做,我想避免这种情况。
有什么想法吗?你是如何处理这个问题的?
答案 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 ,但唯一的程序集引用必须是其中包含这两个接口的第三个程序集(我们称之为这是一个“合同”集合,但这不是行业标准术语或任何东西。)