【问题标题】:How to pass data back in when closing a view关闭视图时如何将数据传回
【发布时间】:2013-08-13 18:36:15
【问题描述】:

我有一个 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 -&gt; another -&gt; first,而它应该只是first

因此,在我将ReturnCommand 中的ShowViewModel 替换为Close(this) 之后,我已经解决了导航问题,并且我不会生成一长串不需要的视图模型。但是,我失去了将数据从AnotherViewModel 传回第一个的能力。

那么,当第二个视图模型关闭时,如何将数据传回我的第一个视图模型?

【问题讨论】:

标签: ios xamarin mvvmcross


【解决方案1】:

1

您可能已经知道,您始终可以在视图模型中使用一种变量形式,该变量可以从另一个视图模型访问。例如使用静态变量。但是,imo 这不是一个好习惯,特别是当您要在应用程序中重复此模式时。

2

就您而言,我认为您可以从MvvmCross Messenger plugin 中受益。查看MvvmCross N+1 的 N=9 以获取有关实施的更多信息。 here 也提供示例源代码。

通过使用 messenger 插件,这很容易。您只需在关闭子视图之前发布一条消息。父视图已经订阅接收这种消息,其余的应该是直截了当的。

【讨论】:

  • 谢谢。我认为这很有帮助。我基本上已经完成了#1,但在观看视频后,我认为重新调整它以使用信使可能是有意义的。
猜你喜欢
  • 2017-02-28
  • 1970-01-01
  • 1970-01-01
  • 2014-01-17
  • 2013-12-18
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多