将片段添加到 activity 以便两者的 ViewModel 都由 MvvmCross 处理

add fragment to activity so ViewModels of both are handled by MvvmCross

我有片段:

[MvxFragmentPresentation(AddToBackStack = true)]
public class MyFragmentView : MvxFragment<MyFragmentViewModel>
{
...
}

此片段用作“经典 NavigationDrawer UI 模式”中的内容,它工作正常。
打开者:

NavigationService.Navigate<MyFragmentViewModel>();

此外,我想在独立 Activity 的片段上方嵌套,开头如下:

NavigationService.Navigate<MyActivityViewModel>();

这个 activity 将有额外的 EditTexts、TextViews 等
稍后我将开发从 MyActivity 到调用者的返回结果。

如何在 Activity 中嵌套 Fragment,以便(MyFragment 和 MyActivity)的 ViewModel 都由 MvvmCross 管理?

提前致谢!

您需要指定将托管您的片段的 activity,正如您在 docs 中看到的那样,您可以设置 ActivityHostViewModelType,它是与Activity 将像这样托管您的片段:

[MvxFragmentPresentation(AddToBackStack = true, ActivityHostViewModelType = typeof(MyActivityThatHostsTheFragmentsViewModel))]
public class MyFragmentView : MvxFragment<MyFragmentViewViewModel>
{
...
}

您还可以为需要的片段添加布局容器的 ID:

[MvxFragmentPresentation(AddToBackStack = true, ActivityHostViewModelType = typeof(MyActivityThatHostsTheFragmentsViewModel), FragmentContentId = Resource.Id.Content)]
public class MyFragmentView : MvxFragment<MyFragmentViewViewModel>
{
...
}

您可以在 MvvmCross 的 playground 上找到示例。

更新:

如果您需要在不同的容器上使用相同的片段,那么您需要具有多个属性,例如here(正如您还看到的,您可以在属性上指定不同的内容,例如一个有片段内容 ID 而另一个没有)

[MvxFragmentPresentation(AddToBackStack = true, ActivityHostViewModelType = typeof(MyActivityThatHostsTheFragmentsViewModel))]
[MvxFragmentPresentation(ActivityHostViewModelType = typeof(OtherActivityThatHostsTheFragmentsViewModel), FragmentContentId = Resource.Id.Content)]
public class MyFragmentView : MvxFragment<MyFragmentViewViewModel>
{
...
}