我已经包含其中有一个玩家属性,它是玩家的对象列表的团队视图模型。 在TeamView球队深装,所以玩家数据已经在内存中。
什么是给定的选择的播放器类的实例传递给PlayerView的最佳方式?
问题是,MVVMCross视图模型构造函数只能包含在当前版本字符串属性。
我有以下观点:
通过选择播放器的ID和Team.Players属性分配作为视图模型的PlayerView。 这可能是一个合理的解决方案,如果选择的球员只是在PlayerView注目选手和PlayerView是真正的“玩家”的观点,在这里用户可以对其他球队的球员之间的滑动为好。
有一个ASP.Net MVC像ViewBag服务,可以只携带导航动作之间的数据,在字典一样存储,并传递给PlayerView参数是“viewbag:PlayerId123”这是一个特殊的键指向类实例。
序列所选择的对象到字符串和序列化的对象将它传递给构造。 这是可能的,但我不喜欢这样的解决方案。
在一般的导航,MvvmCross只允许的ViewModels之间传递字符串。
这样做的原因是,该导航需要在通过机制,如XAML中尤里斯或Android意图的平台层面上进行。
对于你的建议的情况下,一般模式我会typcially使用方法是:
- 该TeamViewModel使用一个注入ITeamService得到来自网络的数据团队
- 该TeamViewModel还采用了注射单ITeamCache缓存队
- 该导航通过调用偏偏喜欢:
this.RequestNavigate<PlayerViewModel>(new { teamId, playerId })
- 在PlayerViewModel然后接收TeamId和PlayerId在其构造,并使用ITeamCache收集正确的玩家
此代码可能看起来像:
public class TeamViewModel
: MvxViewModel
, IMvxServiceConsumer<ITeamCache>
{
public TeamViewModel(string teamId, string playerId)
{
var teamCache = this.GetService<ITeamCache>();
Player = teamCache.GetPlayer(teamId, playerId);
if (Player == null)
{
// todo - handle this error somehow!
}
}
public Player Player { get; set; }
}
请注意,上面的测试代码是否Player是null
。 这是因为有一个与你的假设一个问题“在TeamView球队深装,所以玩家数据已经在记忆中。”
问题是,在像Android和WP7平台,操作系统是免费的,从内存中删除您的应用程序,稍后再重新启动它。 这被称为墓碑上WP7,只是好像是叫杀 Android上。
在这些情况下,则操作系统可能后,当用户返回重启您的应用程序。 此重新启动将直接到用户最后的活动,它会记住后退堆栈 - 那么这将是到你的应用程序能够正确补充水分任何需要的物品放回内存。
下面是一些很小的图片解释这个...
有关更多详细信息,请参阅Xamarin和MSDN
为您的球队/球员的情况下,你也许能够应付因补液:
- 实施ITeamCache为文件支持的对象 - 例如,它可以使用JSON文件或SQLite数据库作为持久性存储在内存中的数据
- 在代码中实现一些逻辑,在需要时从重新提取网络数据
- 实现在这些情况下,一些应急导航的回家庭战略 - 为这类事件不发生,经常在丰富的现代资源手机的许多应用。
- 只是崩溃 - 尽管这是不可取的......
这并不奇怪,许多应用程序不处理墓碑非常好...
注 - 小物件,你的选择3(序列化)可效果很好 - 但是,这并不其中,app补液发生和用户,然后从PlayerViewModel到TeamViewModel导航回帮你的情况。
欲了解更多一些的内MvvmCross在Android生命周期的最新变化,请参阅http://slodge.blogspot.co.uk/2012/05/android-application-initialization-and.html
文章来源: What is the best way to pass objects to “navigated to” viewmodel in MVVMCross?