如何通过 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 时在内部为您执行此操作。所以你不需要自己做。
希望对您有所帮助!
我有一个名为 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 时在内部为您执行此操作。所以你不需要自己做。
希望对您有所帮助!