我有一个称为QViewModel的ViewModel,它扩展了ViewModelBase。在QViewModel类中,我从ViewModelBase调用ToNext()方法,如下所示。我想做的就是通过另一个名为VMTest的视图模型类也扩展了ViewModelBase,然后在ViewModelBase类中启动VMTest,如下面的代码所示。如ViewModelBase类的ToNext()主体中所示,我试图使用ShowViewModel()启动从QViewModel“ VMTest”传递的ViewModel类,但是出现以下错误:viewModel is a variable but used as a type请让我知道如何正确调用ShowViewModel()以启动VMTest viewModel码://In QViewModelToNext(new MvxViewModelRequest< VMTest>);//In ViewModelBasepublic void ToNext(MvxViewModelRequest<ViewModelBase> vm){ if (vm.ViewModelType.Name == typeof(ViewModelBase).Name { var viewModelLoader = Mvx.Resolve<IMvxViewModelLoader>(); var viewModel = viewModelLoader.LoadViewModel(vm, null); ShowViewModel<viewModel>(); } 最佳答案 ShowViewModel<T>是generic方法。使用通用方法时,需要将“ Type parameter”传递到尖括号()中。 Type参数只是类的名称。例如,List<T>是通用类型。如果要创建字符串列表,请输入:List<string> strList = new List<string>();在您发布的代码中,您正在调用ShowViewModel<T>,但是没有传递Type参数,而是传递了本地定义的变量:viewModel。等效于执行此操作:var str = "test";List<str> strList = new List<str>(); //this will throw an error because str is a variable not a type parameter为了解决此问题,您可以这样修改代码://In QViewModelToNext<VmTest>();//In ViewModelBasepublic void ToNext<T>() where T : ViewModelBase{ ShowViewModel<T>();}ToNext方法更改为采用类型参数“ T”的通用方法。 where T : ViewModelBase称为“ Type Constraint”,它告诉编译器,传递给ToNext方法的任何Type参数都必须继承自ViewModelBase。使用不继承自ViewModelBase的参数调用ToNext()会导致编译错误。以下两行已删除:var viewModelLoader = Mvx.Resolve<IMvxViewModelLoader>();var viewModel = viewModelLoader.LoadViewModel(vm, null);当您调用ShowViewModel时,MvvmCross将在内部为您执行此操作。因此,您不需要自己做。希望能帮助到你!关于android - 如何通过ShowViewModel通过ViewModelRequest启动ViewModel,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/54505665/
10-09 00:30