У меня есть ViewModel с именем QViewModel, и он расширяет ViewModelBase. В классе QViewModel я вызываю метод ToNext() из ViewModelBase, как показано ниже. Что я хочу сделать, так это пройти Другой класс модели представления называется VMTest, который также расширяет ViewModelBase, а затем запускает VMTest в классе ViewModelBase, как показано в приведенном ниже коде.
Как показано в теле ToNext() в классе ViewModelBase, я пытаюсь запустить класс ViewModel, переданный из QViewModel «VMTest», с помощью ShowViewModel(), но получаю следующую ошибку:
viewModel is a variable but used as a type
Пожалуйста, дайте мне знать, как правильно вызвать ShowViewModel(), чтобы запустить ViewModel VMTest.
код:
//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> — это метод общий. При использовании универсального метода вам необходимо передать «Тип параметра» в угловые скобки (< >). Параметр 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, передаваемый методу ToNext, должен наследоваться от ViewModelBase. Вызов ToNext() с параметром, который не наследуется от ViewModelBase, вызовет ошибку компиляции.
Следующие две строки были удалены:
var viewModelLoader = Mvx.Resolve<IMvxViewModelLoader>();
var viewModel = viewModelLoader.LoadViewModel(vm, null);
MvvmCross сделает это за вас внутри, когда вы вызовете ShowViewModel. Так что вам не нужно делать это самостоятельно.
Надеюсь, поможет!
спасибо за ответ, это было действительно полезно. но не могли бы вы сообщить мне, что я должен сделать, чтобы я мог назначить модель представления, переданную ToNext, в переменной ??
Вы имеете в виду ShowViewModel<viewModel> или ShowViewModel<vm>?? в любом случае оба они не работают, даже когда я вызываю i.g: ViewModelType. не могли бы вы изменить код, который я разместил ??