prism:ViewModelLocator.AutoWireViewModel =“True”对于未引用的程序集不起作用

我在引导程序中加载我的模块:

protected override IModuleCatalog CreateModuleCatalog() { var moduleCatalog = new DirectoryModuleCatalog(); moduleCatalog.ModulePath = @".\Modules"; return moduleCatalog; } 

在shell项目中引用模块的项目时,它可以正常工作。 正确的ViewModels将由以下附加属性注入。

<UserControl prism:ViewModelLocator.AutoWireViewModel="True" [..]

除非删除项目引用,否则棱镜将不再设置ViewModel:ViewModelLocator.AutoWireViewModel =“True”。

有谁知道是什么原因引起的? 您可以在项目https://github.com/mfe-/Get.the.solution.Prism.Demo上观察此行为。 我怎样才能解决这个问题?

基本上,当ViewModelLocationProvider调用_defaultViewTypeToViewModelTypeResolver ,对Type.GetType(string)的调用返回null。

这可能与MEF一般如何加载程序集有关。 这似乎是MEF的常见问题,谷歌搜索将返回大量类似问题的结果。 这是有同样问题的人:

使用MEF时,Type.GetType返回null

您可以尝试在应用程序的探测路径中添加插件位置。

我个人从不使用MEF作为DI容器,因为它不是一个。 但这是另一天的对话。

编辑:实际上,我只是想到了解决这个问题的更好方法。 只需在您的引导程序中覆盖ConfigureViewModelLocator,如下所示:

  protected override void ConfigureViewModelLocator() { base.ConfigureViewModelLocator(); ViewModelLocationProvider.SetDefaultViewTypeToViewModelTypeResolver(viewType => { var viewName = viewType.FullName; viewName = viewName.Replace(".Views.", ".ViewModels."); var viewAssemblyName = viewType.GetTypeInfo().Assembly.FullName; var suffix = viewName.EndsWith("View") ? "Model" : "ViewModel"; var viewModelName = String.Format(CultureInfo.InvariantCulture, "{0}{1}", viewName, suffix); var assembly = viewType.GetTypeInfo().Assembly; var type = assembly.GetType(viewModelName, true); return type; }); } 

这样我们可以直接向程序集询问类型,而不是试图让框架为我们解决。