【问题标题】:Xamarin Mvvmcross How to show viewmodel with updated parameters in navigation?Xamarin Mvvmcross 如何在导航中显示带有更新参数的视图模型?
【发布时间】:2015-01-19 13:22:24
【问题描述】:

我正在编写 Xamarin.iOS mvvmcross 应用程序。
每当显示视图模型时,我都会保存视图模型请求列表。
然后,如果按下后退按钮,则删除最后一个视图模型请求,并显示上一个视图模型。

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 中反映最新的动物名称。
你有什么建议吗?

【问题讨论】:

    标签: xamarin viewmodel mvvmcross


    【解决方案1】:

    我不太确定您在做什么 - 通常导航控制器会为您存储视图 backstack,并且通常在 back 操作期间,backstack 的导航参数不会更改。

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

    【讨论】:

    • 你能检查我的详细问题描述并再次帮助我吗?
    【解决方案2】:

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

    在这个exampleStuart 中展示了如何使用信使来更新关于位置变化的视图模型。同样的原则也适用于您正在尝试做的事情。

    【讨论】:

      【解决方案3】:

      如果这是关于某种主从构造,您在详细视图中更新数据(例如,您想从主列表中显示的对象的名称),那么我建议您重新加载您的页面正常生命周期中的数据。所以这将是 ViewWillAppearViewDidAppear(因为在这种情况下不会调用 ViewDidLoad,因为页面已经创建)。

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

      【讨论】:

        猜你喜欢
        • 2018-10-23
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-07-02
        • 2018-06-23
        相关资源
        最近更新 更多