将ViewModels与MVVMCross中的片段相关联

时间:2015-01-27 15:22:14

标签: xamarin xamarin.android mvvmcross

我们使用了几个片段作为常用控件:

  1. MyCommonHeaderA
  2. MyCommonHeaderB
  3. 在我们常见的View类中,我们调用base.OnCreate(bundle),一旦返回,我们就会删除片段实例并设置它们的ViewModels

    var commonHeaderAFragment = (MyCommonHeaderA)this.SupportFragmentManager.FindFragmentById(Resource.Id.header1banner);
    if (commonHeaderAFragment != null)
    {
        commonHeaderAFragment.ViewModel = this.ViewModel;
    }
    
    var commonHeaderBFragment = (MyCommonHeaderB)this.SupportFragmentManager.FindFragmentById(Resource.Id.header2banner);
    if (commonHeaderBFragment != null)
    {
        commonHeaderBFragment.ViewModel = this.ViewModel;
    }
    

    直到最近,这一直没有问题。最近我们升级了Xamarin和MVVMCross。

    现在每当我们旋转设备时,OnCreate都会被调用,执行路径最终会在MvxFragmentExtensions.OnCreate中,它会尝试使用FindAssociatedViewModelTypeOrNull查找片段的类型。 Fragment没有关联的ViewModel类型。如果我们关联一个类型,我们永远不需要吗?

    我确实尝试过MvxViewForAttribute和具体类型的ViewModel属性,但这些属性都没有,因为他们想要创建新的VM实例。

    我有一个解决方案,就是在OnCreate基础上,如果我们有一个包,请尝试查找片段并在 ViewModel之前设置他们的base.onCreate属性我们在OnCreate之后没有设置ViewModel属性。它很笨重但有效。我只是想检查一下我们是否应该以不同的方式设置我们的碎片,以便我们不会遇到这个问题

1 个答案:

答案 0 :(得分:0)

有一个使用MvxCachingFragmentActivity的示例:https://github.com/MvvmCross/MvvmCross-AndroidSupport/tree/master/Samples

在那里你不再需要担心这些问题了。