我们使用了几个片段作为常用控件:
在我们常见的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
属性。它很笨重但有效。我只是想检查一下我们是否应该以不同的方式设置我们的碎片,以便我们不会遇到这个问题
答案 0 :(得分:0)
有一个使用MvxCachingFragmentActivity的示例:https://github.com/MvvmCross/MvvmCross-AndroidSupport/tree/master/Samples
在那里你不再需要担心这些问题了。