prism:ViewModelLocator.AutoWireViewModel="True" 不适用于未引用的程序集
prism:ViewModelLocator.AutoWireViewModel="True" will not work for not referenced assemblies
我在引导程序中加载我的模块:
protected override IModuleCatalog CreateModuleCatalog()
{
var moduleCatalog = new DirectoryModuleCatalog();
moduleCatalog.ModulePath = @".\Modules";
return moduleCatalog;
}
当在 shell 项目中引用模块的项目时,它工作正常。正确的 ViewModels 将由以下附加的 属性 注入。
<UserControl prism:ViewModelLocator.AutoWireViewModel="True" [..]</>
除非我删除项目引用,否则 prism:ViewModelLocator.AutoWireViewModel="True".
将不再设置 ViewModels
有人知道是什么原因造成的吗?您可以在项目 https://github.com/mfe-/Get.the.solution.Prism.Demo 上观看此行为。我该如何解决这个问题?
基本上,当 ViewModelLocationProvider 调用 _defaultViewTypeToViewModelTypeResolver
时,调用 Type.GetType(string) returns null.
这可能与 MEF 通常如何加载程序集有关。这似乎是 MEF 的一个常见问题,Google 搜索会 return 很多具有类似问题的结果。
这是有同样问题的人:
Type.GetType returns null when using MEF
您可以尝试在应用程序的探测路径中添加插件位置。
我个人从不使用 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;
});
}
这样我们就可以直接向程序集询问类型,而不是试图让框架为我们弄清楚。
我在引导程序中加载我的模块:
protected override IModuleCatalog CreateModuleCatalog()
{
var moduleCatalog = new DirectoryModuleCatalog();
moduleCatalog.ModulePath = @".\Modules";
return moduleCatalog;
}
当在 shell 项目中引用模块的项目时,它工作正常。正确的 ViewModels 将由以下附加的 属性 注入。
<UserControl prism:ViewModelLocator.AutoWireViewModel="True" [..]</>
除非我删除项目引用,否则 prism:ViewModelLocator.AutoWireViewModel="True".
将不再设置 ViewModels有人知道是什么原因造成的吗?您可以在项目 https://github.com/mfe-/Get.the.solution.Prism.Demo 上观看此行为。我该如何解决这个问题?
基本上,当 ViewModelLocationProvider 调用 _defaultViewTypeToViewModelTypeResolver
时,调用 Type.GetType(string) returns null.
这可能与 MEF 通常如何加载程序集有关。这似乎是 MEF 的一个常见问题,Google 搜索会 return 很多具有类似问题的结果。 这是有同样问题的人:
Type.GetType returns null when using MEF
您可以尝试在应用程序的探测路径中添加插件位置。
我个人从不使用 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;
});
}
这样我们就可以直接向程序集询问类型,而不是试图让框架为我们弄清楚。