如何使用mvvmcross跨屏幕传递数据

时间:2013-06-28 16:15:20

标签: xamarin mvvmcross

我有一个mvvmcross xamarin项目我试图找出在特定情况下跨屏幕发送数据的最佳方法。

我的第一个屏幕是搜索过滤器,它包含用户选择过滤结果的各种标准。第二个屏幕是结果列表屏幕。

我已经看到了解决这个问题的众多选择:

1)使用Init方法 - 我在这里遇到的问题是,当我传递自定义对象时,值始终为null / default。如果我传递一个字符串,它工作正常。如果我可以传递自定义对象,我将传递EntityFilter或实体列表,这是结果。我必须在过滤器页面上查询实体,因为他们在一个过滤器上选择的内容可能会根据剩余的实体影响其他过滤器。我已将以下内容添加到AssemblyInfo.cs中,但仍然无效。

[assembly: InternalsVisibleTo("Cirrious.MvvmCross")]

2)使用消息。这里的问题是更改过滤器时不会创建结果页面,因此消息传递将不起作用。

3)使用内存对象。我创建了一个结果服务,它只包含实体列表的公共属性。它在IoC中注册为懒惰单身(与所有服务一样)。这种方法有效,是我目前的解决方案。但它并没有“感觉”正确。感觉我做错了什么或打破了最佳做法。这是应该做的吗?

1 个答案:

答案 0 :(得分:0)

这是一个经常被问到的问题。

最近有一个关于使用自定义类型进行导航的问题:Custom types in Navigation parameters in v3 - 请注意原始海报在他们的问题中提出了一个解决方案。

关于这个主题,还有其他几个问题。所有这些的基本答案是在许多平台上导航使用序列化技术 - 例如Xaml Urls或Android Intents。因此,并且因为“墓碑”意味着您永远无法确定“新”页面将与“旧”页面位于相同的内存空间中,因此默认情况下MvvmCross坚持为所有{{1使用简单的可序列化类型导航。

为什么导航只允许简单的可序列化类型的相同推理一直重复到MvvmCross v1 - 例如What is the best way to pass objects to "navigated to" viewmodel in MVVMCross?

好消息是,这个主题也在官方项目文档中得到了一些关注 - 但这些文档仍然是一项正在进行中的工作 - 例如见https://github.com/MvvmCross/dev.mvvmcross.com/blob/master/_posts/1970-01-01-page-navigation.markdown