如何在MvxViewPagerFragmentInfo中指定viewmodel参数

问题描述

我想构建一个自定义的viewpager适配器来操纵viewpager片段。而不是通过导航视图模型列表来加载viewpager,我将不得不在适配器中操纵(添加删除)MvxViewPagerFragmentInfo。在处理适配器代码之前,我陷入了使用MvxViewPagerFragmentInfo将参数传递给viewmodel的麻烦。

在Mvvmcross 7之前,可以使用语法构建MvxViewPagerFragmentInfo

MvxViewPagerFragmentInfo(string title,string tag,Type fragmentType,Type viewmodelType,object parameterValuesObject = null).

可以使用这种语法轻松地传递参数。

从7.x开始,变成了

MvxViewPagerFragmentInfo(string title,MvxviewmodelRequest request) 

其中

MvxviewmodelRequest(Type viewmodelType,IMvxBundle parameterBundle,IMvxBundle presentationBundle)

我无法再传递参数。

我尝试使用以下代码在MvxviewmodelRequest中指定参数,但未成功:

IMvxJsonConverter mvxJsonConverter = Mvx.IoCProvider.Resolve<IMvxJsonConverter>();
Core.Models.AppSetting appSetting = new Core.Models.AppSetting() { Id = 1 };
IMvxBundle mvxParmBundle = new MvxBundle(new Dictionary<string,string> { { "parameter",mvxJsonConverter.SerializeObject(appSetting) } });
var fragments = new List<MvxViewPagerFragmentInfo>
{
    new MvxViewPagerFragmentInfo("1","",typeof(Tab1View),new MvxviewmodelRequest(typeof(Tab1viewmodel),mvxParmBundle,null)),new MvxViewPagerFragmentInfo("2",typeof(Tab2View),new MvxviewmodelRequest(typeof(Tab2viewmodel))),new MvxViewPagerFragmentInfo("3",typeof(Tab3View),new MvxviewmodelRequest(typeof(Tab3viewmodel)))
};
viewPager.Adapter = new MvxCachingFragmentStatePagerAdapter(Activity,ChildFragmentManager,fragments);

加载Tab1viewmodel时,不触发Prepare函数。在MvxViewPagerFragmentInfo中指定viewmodel参数的正确语法或正确方法是什么?

谢谢

尼克

解决方法

我刚刚遇到了同样的问题,@Cheesebaron 帮助了我! 所以这个函数:

MvxViewPagerFragmentInfo(string title,string tag,Type fragmentType,MvxViewModelRequest request)

也可以这样使用:

MvxViewPagerFragmentInfo(string title,MvxViewModelInstanceRequest request)

因为 MvxViewModelInstanceRequest 是 MvxViewModelRequest 类型。在 MvxViewModelInstanceRequest 中,您可以传入已填充的 ViewModel 实例。


所以这一行:

new MvxViewPagerFragmentInfo("1","",typeof(Tab1View),new MvxViewModelRequest(typeof(Tab1ViewModel),mvxParmBundle,null)),

可以

new MvxViewPagerFragmentInfo("1",new MvxViewModelInstanceRequest(new Tab1ViewModel())),

所以你可以在构造函数中传递任何参数。