正在覆盖mvvmcross视图定位器
本文关键字:视图 定位器 mvvmcross 覆盖 | 更新日期: 2023-09-27 18:20:25
我一直在重构我的工作解决方案,将多个程序集用作可重用模块。它有以下组件
App.Framework-解决方案所有方面的通用项目,App.Core-mvvmcross-Core,App.StartupModule-应用程序不同部分的模块的一部分,可在其他项目中重复使用,它包含自己的转发、服务和视图模型。应用程序。Windows,App.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.从我所看到的情况来看,这需要在每个平台上实现一些东西,我猜没有通用的方法来处理所有平台的问题?
提前感谢
视图解析不考虑在其中声明视图的命名空间。因此,在哪个命名空间中定义视图并不重要。
按照惯例,映射是基于类型名称的。因此,如果您执行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();
}