我有一个ViewModel,它有一个打开另一个视图的命令:
public ICommand OpenAnotherViewCommand
{
get
{
return new MvxCommand(() => ShowViewModel<AnotherViewModel>());
}
}
到目前为止,这么好。然后在AnotherViewModel
我希望能够回到第一个视图模型。最初我做了这样的事情:
public ICommand ReturnCommand
{
get
{
Dictionary<string, string> parameters = new Dictionary<string, string>();
// Add some stuff from this model to pass to the first view model
return new MvxCommand(() => {
ShowViewModel<FirstViewModel>(parameters);
}
}
}
我在我的第一个视图模型中添加了InitFromBundle
,这也有效。然而,然后我意识到我原来的第一个视图模型仍然存在(我注意到这是因为一些事件处理程序似乎多次触发!)。我的ShowViewModel
创建了一个新的FirstViewModel
,但旧的first -> another -> first
从未被销毁过(现在看来非常明显)。因此,当应该只是first
时,视图堆栈为ShowViewModel
。
所以在面对忙碌之后,我用ReturnCommand
替换Close(this)
中的AnotherViewModel
,现在我修复了导航问题,并且我没有产生很长的不必要的视图楷模。但是,我丢失的是能够将数据从{{1}}传回第一个。
那么当第二个数据关闭时,如何将数据传回我的第一个视图模型呢?
答案 0 :(得分:2)
您可能已经知道,您始终可以在视图模型中使用可从其他视图模型访问的变量形式。例如,使用静态变量。但是,如果要在整个应用程序中重复此模式,那么这不是一个好习惯。
在您的情况下,我认为您可以从MvvmCross Messenger plugin中受益。查看MvvmCross N+1处的N = 9,了解有关实施的更多信息。还提供了示例源代码here。
通过使用messenger插件,这很容易。您只需在关闭子视图之前发布消息。父视图已经订阅了接收这种消息,其余的应该是直接的。