2015-03-31 68 views
2

据我能找到的资料,MvvmCross视图模型的生命周期是MvvmCross视图模型生命周期

建筑 - 使用IoC的依赖注入

的init() - 导航参数

ReloadState初始化( ) - 立碑后补液

开始() - 初始化和补液完成时调用

我已经实现了我的如下:

public async Task Init(Guid ID) 
{ 
    await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentInventory(ID); 
    ShipmentInventory = ShipmentDataSource.CurrInventory; 

    ShipmentLots = await MPS_Mobile_Driver.Droid.DataModel.ShipmentDataSource.GetShipmentLotList((int)ShipmentInventory.idno, (short)ShipmentInventory.idsub); 

    Inv_DamageList = await ListDataSource.GetInv_Damage(); 
} 
protected override void SaveStateToBundle(IMvxBundle bundle) 
{ 
    base.SaveStateToBundle(bundle); 
    bundle.Data["ShipmentInventory"] = StringSerializer.SerializeObject(ShipmentInventory); 
    bundle.Data["ShipmentLots"] = StringSerializer.SerializeObject(ShipmentLots); 
    bundle.Data["Inv_DamageList"] = StringSerializer.SerializeObject(Inv_DamageList); 
} 

protected override void ReloadFromBundle(IMvxBundle state) 
{ 
    base.ReloadFromBundle(state); 
    ShipmentInventory = StringSerializer.DeserializeObject<ShipmentInventory>(state.Data["ShipmentInventory"]); 
    ShipmentLots = StringSerializer.DeserializeObject<ShipmentLotList>(state.Data["ShipmentLots"]); 
    Inv_DamageList = StringSerializer.DeserializeObject<Inv_DamageList>(state.Data["Inv_DamageList"]); 
    state.Data.Clear(); 
} 

首先,我似乎无法得到模拟器实际破坏活动时,我打的Home键,即使我有一个选项被选中。无论如何,这个活动似乎都在背景中。

这就是说,当我击中主键时,它调用SaveStateToBundle。它永远不会做的就是调用ReloadFromBundle。这使得很难测试实际正在发生的事情。我的担心是,根据生命周期,如果应用程序确实从逻辑删除中恢复,它会在调用ReloadFromBundle之前调用Init。由于Init是将参数传递给ViewModel的首选方法,因此它应该使用该参数来初始化数据。如果发生这种情况,它会调用ReloadFromBundle,它会覆盖在Init中初始化的数据。这很好,但效率很低。有没有一种方法可以在Init中知道ViewModel是由于新导航还是从墓碑中恢复而创建的?

感谢您的任何帮助。

吉姆

回答

3

我有ReloadFromBundle(IMvxBundle state)同样的问题,它永远不会被调用。只有“SaveState”模式似乎工作。

我可以回答你的第二个问题,但:

你不应该使用Init加载数据。您应该只使用它来传递要检索的数据的ID。 “加载”阶段应发生在Start方法中。