我们尝试使用几个标签构建应用程序。作为参考项目,我们使用该示例:http://slodge.blogspot.co.uk/2013/06/n25-tabs-n1-days-of-mvvmcross.html
要获取我们需要创建选项卡的ViewModel实例,我们使用了帖子中提到的“HomeViewModel”模式:Create View Model using MVVMCross built in factory?
我不喜欢这种方法是使用“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);
所以我的问题是:这是完成这项工作的方式,还是只是一种肮脏的解决方法,还有更好的解决方案?
更新:我们找到了解决方案:
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;
}
答案 0 :(得分:8)
'viewmodel生命周期'是MvvmCross中一个有利益冲突的领域。根本原因是:
之间的冲突对于简单的“整页”用户体验,C-I-R-S viewmodel生命周期很容易支持,并确保一致使用。
但是,只要用户体验开始在标签,弹出菜单,汉堡菜单,对话框,拆分视图等中合并,那么:
就我个人而言,我喜欢你的方法 - 尝试确保所有视图模型都是独立的,并且所有视图模型都以相同的方式构建 - 但是MvvmCross并没有强制所有开发人员采用这种方法。
特别是对于标签,大多数现有示例都使用您已识别的“拥有的子视图模型”模式。
但是,如果您愿意,实施其他机制应该相对容易 - 就像您已经拥有的那样。
特别是,您可以:
loaderService
- 通过Mvx.Resolve<IMvxViewModelLoader>();
ShowViewModel
与自定义演示者一起创建视图和视图模型 - 在N=25 video中说明了这一点的开头,但您可以更进一步,实际添加标签以响应ShowViewModel调用使用替代调用在视图中创建子选项卡及其视图模型 - 例如Touch示例当前调用的位置
var screen = this.CreateViewControllerFor(viewModel) as UIViewController;
这很容易被替换为:
var screen = this.CreateViewControllerFor<ChildViewModel>() as UIViewController;;
(或来自MvxCanCreateIosViewExtensionMethods.cs的其他重载之一)
我知道一些用户已经采用了一些这些想法并使用它们的回购是Sliding menu repo - 我认为他们选择使用this.CreateViewControllerFor<TViewModel>
来创建他们的视图模型。这可能是您选择的方式,也可能不是 - 但您可能有兴趣进行试验。