将值从Browse-Child VM链传递给调用者

时间:2014-10-03 11:00:01

标签: mvvmcross

  • MVVMCross
  • Windows应用商店
  • 的Android

我有一个浏览层次结构的VM(BrowseVm)并支持通过

进行前向导航
 ShowViewModel<LeafDetailVM> 

到叶子细节ViewModel(LeafDetailVM)。

当用户在LeafDetail View上时,他们应该可以说“我想要这个”并且它们将返回到启动BrowseVm的视图。

我不能简单地转发导航到启动器,因为这会让我无效的后台堆栈。我不能将BrowseVM视图作为NoHistory页面,因为我需要它在后栈中以支持从LeafDetail视图返回。

我的计划是让启动器使用GUID启动BrowseVm。 BrowseVm会将该GUID传递给LeafDetailVM。

在“我想要这个”命令中,我将引发一个包含GUID的消息,即BrowseVM和发起者都订阅了。然后我将关闭LeafDetailVM。

当BrowseVM收到消息通知时,它将比较GUID,如果匹配,它将自行关闭。

当发起人收到通知时,它将处理现在选择的数据。

这有意义吗?我错过了一个更简单的方法吗?

这与How to pass a parameter from a viewmodel to its parent viewmodel类似,但不处理后台堆栈。

由于

1 个答案:

答案 0 :(得分:0)

我建议你尝试停止在平台上将视图的工作方式与视图模型联系起来。

使用MvvmCross中的自定义Presenter机制,在应用程序(平台特定代码)中,您可以以不同方式处理到某个视图模型的导航,包括关闭视图,修改backstack等。 您可以以任何您需要的方式将导航解释为视图模型。

例如,您可以从View-model中传递ShowViewModel请求中的一些参数,view-presenter(IMvxViewPresenter)可以在Show()中以不同方式解释这些参数以显示视图模型。

在您的情况下,您实际上可以导航到传递所选信息的启动器VM。在视图展示器中,您可以按需要的方式修改Backstack。 在Android上,请确保您已阅读并了解所有LaunchMode标志,例如LaunchMode.SingleTask,它允许您将启动器活动置于最前面而不创建新活动。

我不清楚,BrowseVm是LeafDetailVM的父视图模型吗? 需要更多信息才能准确了解您的情况。