5

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

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

我不喜欢这种方法是用“新”初始化 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);

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

更新:我们来到了那个解决方案:

CreateTabFor<SettingsViewModel>("Settings", "settings");
//This method loads the ViewModel
private UIViewController CreateTabFor<TTargetViewModel>(string title, string imageName)  
    where TTargetViewModel : class, IMvxViewModel
{
    var controller = new UINavigationController();
    controller.NavigationBar.TintColor = UIColor.Black;

    var viewModelRequest = new MvxViewModelRequest(typeof(TTargetViewModel), null, null, null);
    var screen = this.CreateViewControllerFor<TTargetViewModel>(viewModelRequest) as UIViewController;
    SetTitleAndTabBarItem(screen, title, imageName);
    controller.PushViewController(screen, false);
    return controller;
}
4

1 回答 1

8

“视图模型生命周期”是 MvvmCross 中一个利益冲突的领域。根本原因是以下之间的冲突:

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

对于简单的“整页”用户体验,CIRS 视图模型生命周期很容易支持并确保它得到一致使用。

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

  1. 开发人员有时想自己控制视图模型的生命周期
  2. 框架要确保始终创建、激活和墓碑化/再水化视图模型并不容易

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

特别是对于选项卡,大多数现有示例确实使用您确定的“拥有的子视图模型”模式。

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

特别是,您可以:

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

       var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
    

    这可以很容易地用类似的东西代替:

       var screen = this.CreateViewControllerFor<ChildViewModel>() as UIViewController;;
    

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

我知道一些用户已经接受了其中一些想法并使用它们的一个存储库是滑动菜单存储库——我认为他们选择使用它this.CreateViewControllerFor<TViewModel>来创建他们的视图模型。这可能是也可能不是您选择的方式 - 但您可能会感兴趣尝试一下。

于 2013-07-18T10:18:09.173 回答