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.Так что вам не нужно делать это самостоятельно.
Надеюсь, это поможет!