正在覆盖mvvmcross视图定位器

本文关键字:视图 定位器 mvvmcross 覆盖 | 更新日期: 2023-09-27 18:20:25

我一直在重构我的工作解决方案,将多个程序集用作可重用模块。它有以下组件

App.Framework-解决方案所有方面的通用项目,App.Core-mvvmcross-Core,App.StartupModule-应用程序不同部分的模块的一部分,可在其他项目中重复使用,它包含自己的转发、服务和视图模型。应用程序。WindowsApp.Android

我已经设法解决了viewodellocater,并从模块中获得了类型,并使用以下命令启动应用程序,其中startupView是该特定模块的默认视图。

        var method = this.GetType().GetMethod("RegisterAppStart", BindingFlags.FlattenHierarchy)
            .MakeGenericMethod(startupView);
        method.Invoke(this, null);

因此,该应用程序一直运行到core,然后进入windowsphone应用程序,当它试图找到与logonviewmodel相关的视图时,它会崩溃。名称空间已从更改

App.Core.ViewModels.[VIEWMODELNAME] -> App.StartupModule.ViewModels.[VIEWMODELNAME]

这是调试跟踪中我认为失败的部分

    mvx:Diagnostic: 84.00 Error seen during navigation request to LogonViewModel - error KeyNotFoundException: Could not find view for App.StartupModule.ViewModels.LogonViewModel
       at Cirrious.MvvmCross.Views.MvxViewsContainer.GetViewType(Type viewModelType)
   at Cirrious.MvvmCross.WindowsCommon.Views.MvxWindowsViewPresenter.Show(MvxViewModelRequest request)

视图位于名称空间中

App.WindowsPhone.Views

所以我想我的问题是1.有没有一种简单的方法可以告诉viewdispatcher/viewlocator在项目中查找[VIEWMODELNAME]类型的视图2.覆盖映射更好吗?一个人会怎么做呢?3.有其他建议吗?4.从我所看到的情况来看,这需要在每个平台上实现一些东西,我猜没有通用的方法来处理所有平台的问题?

提前感谢

正在覆盖mvvmcross视图定位器

视图解析不考虑在其中声明视图的命名空间。因此,在哪个命名空间中定义视图并不重要。

按照惯例,映射是基于类型名称的。因此,如果您执行ShowViewModel<FirstViewModel>(),它将尝试找到一个名为FirstView的视图。它将尝试在本机iOS或Android应用程序的程序集中查找视图。

如果在其他程序集中定义了视图,则可以覆盖特定于平台的Setup类的AndroidViewAssemblies属性。

好的,在对许多不同的事情进行了多次尝试之后,我找到了问题的解决方案。它不是特别优雅,需要一些重构,但需要做什么。1.在UI项目的设置中,您需要添加Viewmodel程序集,然后世界又好了,解决方案继续运行,但这需要在每个平台上进行。而不是视图组件

    protected override System.Reflection.Assembly[] GetViewModelAssemblies()
    {
      //  return base.GetViewModelAssemblies();
        var result = base.GetViewModelAssemblies();
        var assemblyList = result.ToList();
        var assemblyType = typeof(SBG.NBOL.StartupModule.ViewModels.LogonViewModel);
        assemblyList.Add(assemblyType.GetTypeInfo().Assembly);
        return assemblyList.ToArray();
    }