为 MvxTabViewController 托管和初始化多个 MVVMCross ViewModel
Posted
技术标签:
【中文标题】为 MvxTabViewController 托管和初始化多个 MVVMCross ViewModel【英文标题】:Hosting and initialising multiple MVVMCross ViewModels for the MvxTabViewController 【发布时间】:2015-05-11 10:17:45 【问题描述】:我需要在 ios 中创建一个选项卡视图。我试图通过简单地将 UITabBar 添加到 MvxViewController 来做到这一点,但我无法让它工作(参见this question if interested)
我现在正尝试使用 MVVMCross 和 Apple 似乎将我推向 TabController 的方法。
在我们的核心项目中,我们有 4 个 ViewModel,它们使用 ShowViewModel 调用从一个或多个位置显示,并使用 customerNumber 进行初始化。
-
客户视图模型
CustomerOrdersViewModel
CustomerHistoryViewModel
返回视图模型
在 android 和 Windows 应用商店中,我们为每个 ViewModel 提供了单独的 View。我不想改变我们的核心实现来支持 iOS。我将创建一个名为 TabbedCustomerViewModel
的新 ViewModel,它有 4 个属性,每个托管 ViewModel 一个。
使用在 iOS 项目中注册的自定义 MvxTouchViewPresenter,我可以侦听显示其中一个客户视图的请求,然后将请求切换到 TabbedCustomerViewModel
。我有这个工作,新的 ViewModel 被创建,并且将传递给原始 VM 的初始化参数被传递给拦截 VM 的 Init 方法。
我遇到的问题是知道我应该如何初始化托管的虚拟机。我假设我将不得不手动操作、初始化和启动它们。有没有人对如何做到这一点有任何想法?
N-25 Tab Tutorial 不必担心这一点,因为它托管的 VM 不是独立的,因此没有 Init 和 Start 依赖项
【问题讨论】:
【参考方案1】:我现在也初始化了正在运行的虚拟机。当视图加载时,它会通过查看 ParentViewController 来检查它是否在选项卡式 UI 中。
如果是,它会在新的TabbedCustomerViewModel
上调用自定义方法。我已经复制了 MVVMCross 使用的代码并将其添加到新方法中
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
【讨论】:
以上是关于为 MvxTabViewController 托管和初始化多个 MVVMCross ViewModel的主要内容,如果未能解决你的问题,请参考以下文章
是否可以通过 httpwebrequest 使用 WCF 服务(托管为 Windows 服务托管)?