Как запустить ViewModel пройти через ViewModelRequest через ShowViewModel - PullRequest
0 голосов
/ 03 февраля 2019

У меня есть 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 () правильно для запуска 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 голосов
/ 03 февраля 2019

Когда вы вызываете:

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.

0 голосов
/ 03 февраля 2019

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 называется " ограничение типа ", и оно сообщает компилятору, что любой параметр типа, передаваемый методу ToNext, должен наследоваться от ViewModelBase.Вызов ToNext () с параметром, который не наследуется от ViewModelBase, вызовет ошибку компиляции.

Следующие две строки были удалены:

var viewModelLoader = Mvx.Resolve<IMvxViewModelLoader>();
var viewModel = viewModelLoader.LoadViewModel(vm, null);

MvvmCross сделает это для вас внутренне, когдаВы звоните ShowViewModel.Так что вам не нужно делать это самостоятельно.

Надеюсь, это поможет!

0 голосов
/ 03 февраля 2019

Заменить showViewModel<viewModel>() на showViewModel<YourViewModelType>

...