如何导航到扩展抽象类的ViewModel?

时间:2014-07-18 09:17:59

标签: mvvm mvvmcross

我正在尝试使用MVVMCross建议的程序集架构尽可能多地共享viewmodels:

MyApp.App
└ ViewModels
  ├ GlobalViewModel1
  └ GlobalViewModel2 (abstract)

MyApp.Droid
├ Views
│ ├ View1
│ └ View2
└ ViewModels
  └ ChildOfGlobalViewModel2

MyApp.Store
├ Views
│ ├ View1
│ └ View2
└ ViewModels
  └ ChildOfGlobalViewModel2

我可以正确导航到View1及其关联的视图模型GlobalViewModel1,但是当我想要导航到View2时它会变得更复杂,因为它的视图模型从一个平台到另一个平台略有不同。

我认为如果我在每个平台上注册Mvx.RegisterType<GlobalViewModel2, ChildOfGlobalViewModel2>(),那么当GlobalViewModel1能够使用this.ShowViewModel<GlobalViewModel2>()进行导航时。显然我错了,因为我在应用程序尝试实例化抽象类时遇到异常。

我通过覆盖InitializeViewLookup来查看手动查找初始化,所以我尝试将视图关联到父类和子类,但这些配置都没有成功。

我已经通过注入所需的行为解决了这个问题,因为将它封装在一个类中是相关的,但在某些情况下,这种方法只会强制我创建一些类,这些类会使代码的可读性降低,应用程序将来难以维护。

我是否缺少某些配置或是否应该更改方法?如果是这样,推荐的方法是什么?

1 个答案:

答案 0 :(得分:2)

MvvmCross中的默认设置是viewmodel导航 - 这不包括继承导航。

如果您真的想要,可以覆盖部分mvx以支持您的抽象场景。但是,我认为这将是值得付出的努力。

相反,我建议:

  • 注册具有名为IG2Service的单个属性的服务G2Type。然后,每个平台都可以set Global2的VM类型,然后导航可以在执行导航之前调用get。注意:使用此技术,您将无法使用ShowViewModel<T>覆盖以这种方式导航,但非泛型覆盖应该可以正常工作。
  • 或(如果可能)重构您的代码,以便您的g2视图模型通过依赖注入而不是通过继承来使用特定于平台的代码。
相关问题