在构建"标签"应用程序时创建或注入ViewModel

u_b*_*u_b 5 xamarin.ios xamarin.android mvvmcross xamarin

我们尝试使用几个选项卡构建应用程序.作为参考项目,我们使用该示例:http://slodge.blogspot.co.uk/2013/06/n25-tabs-n1-days-of-mvvmcross.html

为了获得我们需要创建选项卡的ViewModel实例,我们使用了"HomeViewModel" - 该帖子中提到的模式:使用MVVMCross内置工厂创建视图模型?

我不喜欢这种方法是使用"new"初始化ViewModel.据我所知,它跳过了我们真正喜欢的整个ViewModel-Lifecycle(https://github.com/slodge/MvvmCross/wiki/View-Model-Lifecycle).在我们当前的项目中,我们想使用"start()"生命周期方法,但由于使用"new"进行初始化,因此永远不会调用它.

对我们有用的是这样:

var loaderService = Mvx.Resolve<IMvxViewModelLoader>(); 
var vm = (UserListViewModel)loaderService.LoadViewModel(new MvxViewModelRequest(typeof(UserListViewModel), null, null, null), null);
Run Code Online (Sandbox Code Playgroud)

所以我的问题是:这是做这项工作的方式还是只是一个肮脏的解决方法,还有一个更好的解决方案?

更新:我们找到了解决方案:

CreateTabFor<SettingsViewModel>("Settings", "settings");
Run Code Online (Sandbox Code Playgroud)

Stu*_*art 8

'viewmodel生命周期'是MvvmCross中一个相互冲突的领域.根本原因是以下之间的冲突:

  • viewmodel,它只是任何视图的模型
  • viewmodel是在'ShowViewModel'导航过程中专门使用的

对于简单的"整页"用户体验,CIRS viewmodel生命周期易于支持并确保其得到一致使用.

但是,只要用户体验开始在选项卡,弹出菜单,汉堡包菜单,对话框,拆分视图等中合并,那么:

  1. 开发人员有时希望自己控制viewmodel生命周期
  2. 框架并不容易确保始终创建,激活和逻辑删除/重新水化视图模型

就个人而言,我喜欢你的方法 - 尝试确保所有视图模型都是独立的,并且所有视图模型都以相同的方式构建 - 但是MvvmCross并没有强制所有开发人员采用这种方法.

特别是对于制表符,大多数现有示例都使用您已识别的"拥有的子视图模型"模式.

但是,如果您愿意,实施其他机制应该相对容易 - 就像您已经拥有的那样.

特别是,您可以:

  • loaderService直接使用- 通过它获取它Mvx.Resolve<IMvxViewModelLoader>();
  • ShowViewModel与自定义演示者一起使用来创建视图和视图模型 - 在N = 25视频中说明了这一点的开头,但您可以更进一步,并实际添加选项卡以响应ShowViewModel调用.
  • 使用替代调用在视图中创建子选项卡及其视图模型 - 例如,Touch示例当前调用的位置

       var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
    
    Run Code Online (Sandbox Code Playgroud)

    这很容易被替换为:

       var screen = this.CreateViewControllerFor<ChildViewModel>() as UIViewController;;
    
    Run Code Online (Sandbox Code Playgroud)

    (或来自MvxCanCreateIosViewExtensionMethods.cs的其他重载之一)

我知道一些用户已经采用了一些这些想法并使用它们的回购滑动菜单回购 - 我认为他们选择使用它this.CreateViewControllerFor<TViewModel>来创建他们的视图模型.这可能是您选择的方式,也可能不是 - 但您可能有兴趣进行试验.