c# - prism:ViewModelLocator.AutoWireViewModel ="True"不适用于未引用的程序集

标签 c# wpf prism mef

我在 Bootstrap 中加载我的模块:

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

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

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

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

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

最佳答案

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

这可能与 MEF 通常如何加载程序集有关。这似乎是 MEF 的常见问题,Google 搜索会返回很多具有类似问题的结果。 这是有同样问题的人:

Type.GetType returns null when using MEF

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

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

编辑: 实际上,我只是想到了一个更好的方法来解决这个问题。只需像这样在您的 Bootstrap 中覆盖 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;
        });
    }

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

关于c# - prism:ViewModelLocator.AutoWireViewModel ="True"不适用于未引用的程序集,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/33043978/

相关文章:

C# 在继承的构造函数中初始化 Disposable

c# - 找不到@Html.PagedListPager

c# 发出动态方法委托(delegate)以加载参数化构造函数问题

c# - StreamGeometry 与 WPF C# 中的 DrawingContext.DrawLine

c# - 如何在 Ninject 中使用策略模式

c# - 读取 WPF gridview 中的每个单元格值

c# - 后台工作人员的 UI 访问问题

c# - MEF:从类型中获取导出值?

wpf - 在 WPF 智能客户端应用程序中使用 WCF DTO 时理解 MVVM 使用的问题

mvvm - Silverlight MVVM 与 Prism