如何通过 ShowViewModel 通过 ViewModelRequest 启动 ViewModel

How to Start a ViewModel pass through ViewModelRequest via ShowViewModel

我有一个名为 QViewModel 的 ViewModel,它扩展了 ViewModelBase。在 QViewModel class 中,我从 ViewModelBase 调用 ToNext() 方法,如下所示。我想做的是,通过 另一个视图模型 class 称为 VMTest,它也扩展了 ViewModelBase,然后在 ViewModelBase class 中启动 VMTest,如下面的代码所示。

如 ViewModelBase class 中 ToNext() 的主体所示,我正在尝试启动 ViewModel class 我使用 ShowViewModel() 从 QViewModel“VMTest”传递过来,但是我收到以下错误:

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>();
 }

showViewModel<viewModel>()替换为showViewModel<YourViewModelType>

当你打电话时:

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.

ShowViewModel<T> 是尖括号 (< >) 中的 generic method. When using a generic method, you need to pass in the "Type parameter"。Type 参数只是 class 的名称。例如,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);

MvvmCross 将在您调用 ShowViewModel 时在内部为您执行此操作。所以你不需要自己做。

希望对您有所帮助!