我有一个名为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 QViewModel
ToNext(new MvxViewModelRequest< VMTest>);
//In ViewModelBase
public 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>();
}
答案 0 :(得分:1)
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 QViewModel
ToNext<VmTest>();
//In ViewModelBase
public 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将在内部为您执行此操作。因此,您不需要自己做。
希望有帮助!
答案 1 :(得分:0)
将showViewModel<viewModel>()
替换为showViewModel<YourViewModelType>
答案 2 :(得分:0)
致电时:
var viewModel = viewModelLoader.LoadViewModel(vm, null);
您创建一个名为viewModel
的变量。接下来,您称为ShowViewModel<viewModel>();
。这将给您一个编译错误,因为正如您所说的那样,您尝试将变量用作类型。您是否有任何理由要使用ViewModelRequest
来显示页面?如果没有,我会尝试以下选项之一:
一种方法(使用变量):
public void ToNext(Type viewModel)
{
ShowViewModel(viewModel);
}
然后在QViewModel中可以调用
base.ToNext(typeof(VMTest));
另一种方式(使用类型):
public void ToNext<T>() where T : IMvxViewModel
{
ShowViewModel<T>();
}
然后在QViewModel中可以调用
base.ToNext<VMTest>();
您的ViewModelBase
应该继承MvxViewModel
。