是不是ReloadState方法与MvxViewModel上的Init冲突?

时间:2016-01-22 17:03:23

标签: android xamarin mvvmcross

根据这个https://github.com/MvvmCross/MvvmCross/wiki/View-Model-Lifecycle,我们应该实现保存状态和重载状态来处理逻辑删除。

但是如果我们在Init方法中有一个值参数会怎样?

示例:

public StockDetailViewModel
{
    int stockId;

    ...

    void Init(int stockIdAsIntent)
    {
        stockId = stockIdAsIntent
    }

    protected override void ReloadFromBundle(IMvxBundle state)
    {
        id = int.Parse(state.Data["id"]);
    }

    protected override void SaveStateToBundle(IMvxBundle bundle)
    {
        bundle.Data["id"] = stockId;
    }

    async void Start()
    {
         stockModel = StockService.Get(stockId);
    }

    ...
}

现在假设我们导航到名为StockFormViewModel的子视图模型。 这样做会调用SaveState方法。 现在我们打开表单,开展业务,然后致电this.Close(this);

如果我们关注CIRS,首先会调用Init,然后调用ReloadState

但是Init方法将失败,因为我们来自子视图模型,没有给出意图作为参数,没有机会让ReloadState方法启动并恢复stockId。

我很确定我在这里做错了什么,但我不能把手指放在上面......

1 个答案:

答案 0 :(得分:0)

事实证明,我将MVVMCross导航与父目标导航混合(由于基类的旧重构)。 完全可以理解,这些不会一起工作。

我切换到完整的MVVMCross导航,有了这个,有两种情况:

  1. 如果视图模型仍然在缓存中(mvvmcross有一个VM缓存),它会从那里获取VM,因此,当你在" child"上调用close时,没有一个初始化方法是叫(Init,Reload或Start)。
  2. 如果视图模型不在缓存中,它将重建VM并调用ReloadState而不是Init。