我已经看过几个讨论MvvmCross中视图模型之间传递导航对象的线程(例如here和here),我想知道为什么MvvmCross没有对序列化的内置int支持复杂类型。
让我澄清一下。如果我有一个导航对象,其中包含CustomerName(字符串)和RecentPurchases(List),其中Purchase类型是一个具有一些基本类型属性的类,那么当我将此导航对象传递给ShowViewModel时,在接收端我会得到一个更正RecentPurchases的CustomerName和null。 MvvmCross无法识别列表对序列化的简单性。这可以通过将RecentPurchases替换为SerializedRecentPurchases并将其值分配如下来轻松解决:
SerializedRecentPurchases = Mvx.Resolve<IMvxJsonConverter>()
.SerializeObject(RecentPurchases);
以类似的方式在ViewModels的Init方法中对字符串进行反序列化。
这一切都非常简单,但我有点疑惑为什么MvvmCross不会尝试执行序列化,以免开发人员一次又一次地编写这些代码行。我知道我们必须小心使用导航对象传递大量数据,但另一方面,导航(或持久状态)对象可能包含简单复杂类型的集合是很常见的,所以如果不是更实用的话MvvmCross开箱即用支持这种情况了吗?
答案 0 :(得分:8)
在v3中引入导航“简单序列化”的原因是:
Uri
限制为~2050个字符,但在此之下我认为WP限制较小仍然 - 约1100个字符)如果MvvmCross开箱即用支持这种情况会不会更实用?
可能 - 这就是“{3}}目前阻止的”1行设置更改“的意图
在某些情况下,传递复杂的基于列表可能很方便 - 并且有几个平台没有WindowsPhone的导航限制。
为了解决这个问题,MvvmCross v3的主要目标之一是“Project CHIMP”,也被称为“CrossLight”。 CHIMP的目标是将MvvmCross拆分为单独的CrossCore,Binding,Mvvm和插件层 - 这个结构应该让其他人更容易构建自己的应用程序框架。因此,现在其他人应该很容易提供替代框架 - 可能包括完全不同的导航服务模式。
Project Chimp / CrossLight还有更多内容:
然而,在MvvmCross本身内部,我个人仍然建议反对在序列化期间传递大型复杂对象 - 我的导航对象很少是暂时的,所以对我来说通过“{感觉更好”通过{{1 s对象而不是对象本身。