Xamarin Mvvmcross如何在导航中显示带有更新参数的viewmodel?

时间:2015-01-19 13:22:25

标签: xamarin viewmodel mvvmcross

我正在写Xamarin.iOS mvvmcross应用程序。
每当显示一个viewmodel时,我都保存了viewmodelrequest的列表 然后,如果按下后退按钮,则删除最后一个viewmodelrequest,并显示上一个viewmodel。

var loaderService = Mvx.Resolve<IMvxViewModelLoader>();
var viewModel = loaderService.LoadViewModel(lastRequest, null/*saved state*/);
var myVC = this.CreateViewControllerFor(viewModel) as MyViewModelView;
NavigationController.PushViewController(myVC, true); 

这在显示没有参数的视图模型时效果很好 但如果视图模型具有参数,则显示旧的参数 如何用最新参数显示视图模型?

PS:让我解释一下我的情况的更多细节 我有3个触摸视图。 View1有一个动物表,当我点击桌面上的一个项目时,应用程序将导航到View2,AnimalDetailView。 当我单击视图中的编辑按钮时,将出现View3,AnimalEditView 有3个视图模型,每个视图模型用于每个视图 在View3中更改并保存动物名称后,它将正确保存在AnimalEditViewModel中 但是当我点击View3中的自定义后退按钮时,View2出现了以前的动物名称 为了显示View2,我使用了上面的代码 我想在View2中反映最新的动物名称 你有什么建议吗?

3 个答案:

答案 0 :(得分:1)

我不太确定你在做什么 - 通常导航控制器为你存储视图后台堆栈,通常backstack的导航参数在back动作期间不会改变。

但是,如果您想在任何MvxViewModelRequest期间更改参数,则可以访问ParameterValues字典中的参数 - 请参阅https://github.com/MvvmCross/MvvmCross/blob/3.5/Cirrious/Cirrious.MvvmCross/ViewModels/MvxViewModelRequest.cs#L32

中的代码

答案 1 :(得分:0)

有几种方法可以实现这一点,但我个人会使用信使通知所有感兴趣的虚拟机该项目已更新。然后,VM可以决定是否需要刷新加载的数据。

在此example Stuart展示了如何使用messenger更新有关位置更改的视图模型。同样的原则也适用于你想要做的事情。

答案 2 :(得分:0)

如果这是关于某种Master-Detail构造,您在详细信息视图中更新数据(例如,您想要从主列表中的列表中显示的对象的名称),那么我建议您重新加载页面常规生命周期中的数据。因此,这将是 ViewWillAppear ViewDidAppear (因为在此方案中未调用ViewDidLoad,因为页面已经创建)。

[编辑] 我错过了你关于更新的最后一句话。另一种方法是使用上面的语句重新加载页面,而当前对象可以在AppDelegate中维护(可在整个应用程序中使用)。