我一直在重构我的工作解决方案,使用多个程序集作为可重用模块。它有以下程序集
App.Framework - 解决方案各方面的常见项目, App.Core - mvvmcross核心, App.StartupModule - 应用程序不同部分的模块的一部分,用于其他项目的可重用性,它包含自己的repos,services和viewmodel。 的 App.Windows 下, App.Android
我设法解决了viewodellocator并从模块中获得了类型的类型,并使用以下内容启动应用程序,其中startupView是该特定模块的默认视图。
var method = this.GetType().GetMethod("RegisterAppStart", BindingFlags.FlattenHierarchy)
.MakeGenericMethod(startupView);
method.Invoke(this, null);
因此,应用程序一直运行通过核心,然后进入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.从我所看到的这将需要在每个平台上实现一些东西,我猜是没有通用的方法来处理所有平台的这个?
提前致谢
答案 0 :(得分:2)
视图解析不会考虑声明视图的命名空间。因此,定义视图的命名空间无关紧要。
按照惯例,映射在类型名称的基础上工作。因此,如果您执行ShowViewModel<FirstViewModel>()
,它将尝试查找名为FirstView的视图。它将尝试在本机iOS或Android应用程序的程序集中查找视图。
如果您已在其他程序集中定义了该视图,则可以覆盖特定于平台的AndroidViewAssemblies
类的Setup
属性。
答案 1 :(得分:1)
在许多不同的事情尝试了许多试错后,我找到了问题的解决方案。它不是特别优雅,需要一些重构,但你需要做什么。 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();
}