如何通过ShowViewModel通过ViewModelRequest启动ViewModel

时间:2019-02-03 17:42:12

标签: android xamarin mvvmcross viewmodel

我有一个名为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>();
 }

3 个答案:

答案 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