为MvxTabViewController托管和初始化多个MVVMCross ViewModel

时间:2015-05-11 10:17:46

标签: xamarin.ios mvvmcross

我需要在iOS中创建一个Tab视图。我试图通过简单地将一个UITabBar添加到MvxViewController来实现这一点但我无法使其工作(参见this question if interested

我现在正试图使用​​MVVMCross的方法,Apple似乎把我推向了一个TabController。

在我们的Core项目中,我们有4个ViewModel,它们使用ShowViewModel调用从一个或多个地方显示,并使用customerNumber进行初始化。

  1. CustomerViewModel
  2. CustomerOrdersViewModel
  3. CustomerHistoryViewModel
  4. ReturnsViewModel
  5. 在Android和Windows应用商店中,我们为每个ViewModel都有单独的视图。我不想改变我们的Core实现来支持iOS。我将创建一个名为TabbedCustomerViewModel的新ViewModel,它将具有4个属性,每个属性对应一个托管的ViewModel。

    使用在iOS项目中注册的自定义MvxTouchViewPresenter,我可以侦听显示其中一个Customer视图的请求,然后将请求切换到TabbedCustomerViewModel。我有这个工作,新的ViewModel被创建,并且传递给原始VM的初始化参数将被传递给拦截虚拟机的Init方法。

    我遇到的问题是知道如何初始化托管的虚拟机。我假设我将不得不手动ctor,init和Start。有没有人对如何做到这一点有任何想法?

    N-25 Tab Tutorial不必担心这个问题,因为它的托管虚拟机不是独立的,因此不具备Init和Start依赖关系

1 个答案:

答案 0 :(得分:0)

我现在也在初始化虚拟机。当View加载时,它通过查看ParentViewController检查它是否在选项卡式UI中。

如果是,则在新TabbedCustomerViewModel上调用自定义方法。我复制了MVVMCross使用的代码并将其添加到新的Method

try
{
    mvxViewModel.CallBundleMethods("Init", this.initialisationParameters);
    if (reloadedState != null)
    {
        mvxViewModel.CallBundleMethods("ReloadState", reloadedState);
    }
    mvxViewModel.Start();
}
catch (Exception exception)
{
    throw exception.MvxWrap("Problem initialising viewModel of type {0}", mvxViewModel.GetType().Name);
}

initialisationParameters和reloadedState在初始化时由TabbedCustomerViewModel存储,以便它可以将其传递给它正在托管的ViewModels