2015-11-04 58 views
0

我一直在重构我的工作解决方案,使用多个程序集作为可重用模块。它具有以下组件覆盖mvvmcross查看定位器

App.Framework - 整个解决方案的各个方面共同的项目, App.Core - mvvmcross核心, App.StartupModule - 为应用程序的不同部分模块的一部分,在其他项目中可重复使用,它包含自己的回购,服务和视图模型。 App.WindowsApp.Android

我已成功地解决了viewodellocator和具有从所述模块的类型assemnly并使用以下来启动应用程序,其中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. is重写映射更好吗?以及如何去做这件事? 3.有什么其他建议要重写以修复此问题? 4.从什么看到这将需要在每个平台上实现一些东西,即时通讯猜测没有通用的方式来处理这个所有平台?

在此先感谢

回答

1

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

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(); 
    } 
2

视图分辨率不参与该意见被宣布纳入考虑的命名空间。因此,在您的视图定义的命名空间中无关紧要。

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

如果您已经在不同的装配体中定义了该视图,则可以覆盖特定于平台的Setup类的AndroidViewAssemblies属性。

+0

这就是我认为会发生,但是做出我的更改后,它不能再找到我的UI项目,这是工作正常之前的看法?所以不知道发生了什么然后:/ – Barry

+0

我shuold可能会补充说,我已覆盖导航,并使用此 公共无效导航(类型viewModelType,对象参数) { ShowViewModel(viewModelType,parameters); } – Barry

+0

您是否在与本机iOS,Windows或Android项目不同的程序集中定义了视图? – Stephanvs