棱镜:ViewModelLocator.AutoWireViewModel =“True"将不适用于未引用的程

本文关键字:适用于 不适用 引用 quot AutoWireViewModel ViewModelLocator True 棱镜 | 更新日期: 2023-09-27 18:17:09

我在bootstrapper中加载我的模块:

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

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

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

除非我删除项目引用,否则ViewModels将不再由prism设置:ViewModelLocator.AutoWireViewModel="True".

有人知道是什么原因造成的吗?您可以在项目https://github.com/mfe-/Get.the.solution.Prism.Demo上查看此行为。我该如何解决这个问题?

棱镜:ViewModelLocator.AutoWireViewModel =“True"将不适用于未引用的程

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

这可能与MEF加载程序集的一般方式有关。这似乎是一个常见的问题与MEF和谷歌搜索将返回许多结果与类似的问题。下面是有同样问题的人:

类型。当使用MEF

时,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;
        });
    }

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