C# 在mvvmcross中从一个viewmodel导航到另一个viewmodel时崩溃
我想使用mvvmcross中的viewmodels从一个屏幕移动到下一个屏幕,并将一些模型传递到下一个ViewModel。但我遇到了以下问题: MvvmCross.Platform.Exceptions.MvxException:无法从定位器MvxDefaultViewModelLocator为类型iManage.ViewModels.LoginViewModel构造和初始化ViewModel-有关详细信息,请检查InnerException-->MvvmCross.Platform.Exceptions.MvxException:创建LoginViewModel类型的ViewModel时出现问题--->MvvmCross.Platform.Exceptions.MvxIoCResolveException:创建iManager.ViewModels.LoginViewModel时未能解析SchoolModel类型的参数项的参数 在MvvmCross.Platform.IoC.MvxSimpleIoCContainer.GetIoCParameterValues处(System.Type类型、System.Reflection.ConstructorInfo firstConstructor)[0x00066]输入:0 在:0中的MvvmCross.Platform.IoC.MvxSimpleIoCContainer.IoCConstruct(System.Type类型)[0x0002c]处 在MvvmCross.Platform.Mvx.IocConstruct(System.Type t)[0x00006]中:0 在MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load(System.Type viewModelType、MvvmCross.Core.ViewModels.IMvxBundle参数值、MvvmCross.Core.ViewModels.IMvxBundle保存状态)[0x00000]中:0 ---内部异常堆栈跟踪的结束--- 在MvvmCross.Core.ViewModels.MvxDefaultViewModelLocator.Load(System.Type viewModelType、MvvmCross.Core.ViewModels.IMvxBundle参数值、MvvmCross.Core.ViewModels.IMvxBundle保存状态)[0x00029]中:0 在MvvmCross.Core.ViewModels.MVXViewModelLoadLoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest请求,MvvmCross.Core.ViewModels.IMvxBundle保存状态)[0x00035]中:0 ---内部异常堆栈跟踪的结束--- 在MvvmCross.Core.ViewModels.MVXViewModelLoadLoadViewModel(MvvmCross.Core.ViewModels.MvxViewModelRequest请求,MvvmCross.Core.ViewModels.IMvxBundle保存状态)[0x00068]中:0 在MvvmCross.iOS.Views.MVXViewController ExtensionMethods.LoadViewModel(MvvmCross.iOS.Views.IMvxIosView iosView)[0x0005f]中:0 在MvvmCross.Core.Views.MvxViewExtensionMethods.OnViewCreate(MvvmCross.Core.Views.IMvxView视图,System.Func`1[TResult]viewModelLoader)[0x00012]中:0 在MvvmCross.iOS.Views.MVXViewController ExtensionMethods.OnViewCreate(MvvmCross.iOS.Views.IMvxIosView iosView)[0x00001]中:0 在MvvmCross.iOS.Views.MVXViewController适配器.HandleviewIDLoadCalled处(System.Object sender,System.EventArgs e)[0x00007]输入:0 at(包装器委托调用):调用\u void\u object\u EventArgs(对象,System.EventArgs) 在:0中的MvvmCross.Platform.Core.MvxDelegateExtensionMethods.Rise(System.EventHandler,System.Object sender)[0x00003]处 在:0中的MvvmCross.Platform.iOS.Views.MvxEventSourceViewController.ViewDidLoad()[0x00006]处 在MvvmCross.iOS.Views.MvxViewController.ViewDidLoad()[0x00001]中:0 在/Users/pankajsachdeva/Projects/iManage/iOS/Views/LoginView.viewdiload()[0x00001]中的iManage.iOS.Views.LoginView:18 在(包装器管理为本机)UIKit.UIApplication:UIApplicationMain(int,string[],intptr,intptr) 在/Users/builder/data/lanes/5665/f70a1348/source/xamarin macios/src/UIKit/UIApplication.cs:79中的UIKit.UIApplication.Main(System.String[]args,System.IntPtr principal,System.IntPtr delegate)[0x00005] 在/Users/builder/data/lanes/5665/f70a1348/source/xamarin macios/src/UIKit/UIApplication.cs:63中的UIKit.UIApplication.Main(System.String[]args,System.String principalClassName,System.String delegateClassName)[0x00038]处 在/Users/pankajsachdeva/Projects/iManage/iOS/Main.cs:17中的iManage.iOS.Application.Main(System.String[]args)[0x00001] 从ViewModel代码:C# 在mvvmcross中从一个viewmodel导航到另一个viewmodel时崩溃,c#,xamarin,mvvm,xamarin.ios,mvvmcross,C#,Xamarin,Mvvm,Xamarin.ios,Mvvmcross,我想使用mvvmcross中的viewmodels从一个屏幕移动到下一个屏幕,并将一些模型传递到下一个ViewModel。但我遇到了以下问题: MvvmCross.Platform.Exceptions.MvxException:无法从定位器MvxDefaultViewModelLocator为类型iManage.ViewModels.LoginViewModel构造和初始化ViewModel-有关详细信息,请检查InnerException-->MvvmCross.Platform.Excep
public class SchoolSelectionViewModel : BaseViewModel
{
private readonly ISchoolNames _schoolService;
public SchoolSelectionViewModel(ISchoolNames schoolService)
{
_schoolService = schoolService;
}
public override void Start()
{
IsLoading = true;
_schoolService.GetFeedItems(OnDilbertItems, OnError);
}
private void OnDilbertItems(List<SchoolModel> list)
{
IsLoading = false;
Items = list;
}
private void OnError(Exception error)
{
// not reported for now
IsLoading = false;
}
private List<SchoolModel> _items = new List<SchoolModel>();
public List<SchoolModel> Items
{
get { return _items; }
set { _items = value; RaisePropertyChanged(() => Items); }
}
private MvxCommand<SchoolModel> _itemSelectedCommand;
public ICommand ItemSelectedCommand
{
get
{
_itemSelectedCommand = _itemSelectedCommand ?? new MvvmCross.Core.ViewModels.MvxCommand<SchoolModel>(DoSelectItem);
return _itemSelectedCommand;
}
}
private void DoSelectItem(SchoolModel item)
{
//ShowViewModel<LoginViewModel>(item);
ShowViewModel<LoginViewModel>(new LoginViewModel(item));
}
}
public class LoginViewModel : BaseViewModel
{
private readonly ILoginService _loginService;
private readonly IDialogService _dialogService;
public LoginViewModel(SchoolModel item)
{
//_loginService = loginService;
//_dialogService = dialogService;
School = item;
Username = "TestUser";
Password = "YouCantSeeMe";
IsLoading = false;
}
private SchoolModel _school;
public SchoolModel School
{
get
{
return _school;
}
set
{
SetProperty(ref _school, value);
RaisePropertyChanged(() => School);
}
}
private string _username;
public string Username
{
get
{
return _username;
}
set
{
SetProperty(ref _username, value);
RaisePropertyChanged(() => Username);
}
}
private string _password;
public string Password
{
get
{
return _password;
}
set
{
SetProperty(ref _password, value);
RaisePropertyChanged(() => Password);
}
}
private IMvxCommand _loginCommand;
public virtual IMvxCommand LoginCommand
{
get
{
_loginCommand = _loginCommand ?? new MvxCommand(AttemptLogin, CanExecuteLogin);
return _loginCommand;
}
}
private void AttemptLogin()
{
if (_loginService.Login(Username, Password))
{
ShowViewModel<DashboardStdViewModel>();
}
else
{
_dialogService.Alert("We were unable to log you in!", "Login Failed", "OK");
}
}
private bool CanExecuteLogin()
{
return (!string.IsNullOrEmpty(Username) || !string.IsNullOrWhiteSpace(Username))
&& (!string.IsNullOrEmpty(Password) || !string.IsNullOrWhiteSpace(Password));
}
}
公立学校选择ViewModel:BaseViewModel
{
私立只读学校名称学校服务;
公立学校选择视图模型(ISchoolNames学校服务)
{
_学校服务=学校服务;
}
公共覆盖无效开始()
{
IsLoading=true;
_学校服务。GetFeedItems(OnDilbertItems,OnError);
}
私有项目(列表)
{
IsLoading=false;
项目=列表;
}
私有void OnError(异常错误)
{
//目前还没有报道
IsLoading=false;
}
私有列表_items=新列表();
公共清单项目
{
获取{return\u items;}
设置{u items=value;RaisePropertyChanged(()=>items);}
}
专用MvxCommand _itemSelectedCommand;
公共ICommand ItemSelectedCommand
{
得到
{
_itemSelectedCommand=\u itemSelectedCommand??新建MvvmCross.Core.ViewModels.MvxCommand(DoSelectItem);
返回_itemSelectedCommand;
}
}
私有项目(学校模型项目)
{
//ShowViewModel(项目);
ShowViewModel(新登录视图模型(项目));
}
}
要查看模型代码,请执行以下操作:
public class SchoolSelectionViewModel : BaseViewModel
{
private readonly ISchoolNames _schoolService;
public SchoolSelectionViewModel(ISchoolNames schoolService)
{
_schoolService = schoolService;
}
public override void Start()
{
IsLoading = true;
_schoolService.GetFeedItems(OnDilbertItems, OnError);
}
private void OnDilbertItems(List<SchoolModel> list)
{
IsLoading = false;
Items = list;
}
private void OnError(Exception error)
{
// not reported for now
IsLoading = false;
}
private List<SchoolModel> _items = new List<SchoolModel>();
public List<SchoolModel> Items
{
get { return _items; }
set { _items = value; RaisePropertyChanged(() => Items); }
}
private MvxCommand<SchoolModel> _itemSelectedCommand;
public ICommand ItemSelectedCommand
{
get
{
_itemSelectedCommand = _itemSelectedCommand ?? new MvvmCross.Core.ViewModels.MvxCommand<SchoolModel>(DoSelectItem);
return _itemSelectedCommand;
}
}
private void DoSelectItem(SchoolModel item)
{
//ShowViewModel<LoginViewModel>(item);
ShowViewModel<LoginViewModel>(new LoginViewModel(item));
}
}
public class LoginViewModel : BaseViewModel
{
private readonly ILoginService _loginService;
private readonly IDialogService _dialogService;
public LoginViewModel(SchoolModel item)
{
//_loginService = loginService;
//_dialogService = dialogService;
School = item;
Username = "TestUser";
Password = "YouCantSeeMe";
IsLoading = false;
}
private SchoolModel _school;
public SchoolModel School
{
get
{
return _school;
}
set
{
SetProperty(ref _school, value);
RaisePropertyChanged(() => School);
}
}
private string _username;
public string Username
{
get
{
return _username;
}
set
{
SetProperty(ref _username, value);
RaisePropertyChanged(() => Username);
}
}
private string _password;
public string Password
{
get
{
return _password;
}
set
{
SetProperty(ref _password, value);
RaisePropertyChanged(() => Password);
}
}
private IMvxCommand _loginCommand;
public virtual IMvxCommand LoginCommand
{
get
{
_loginCommand = _loginCommand ?? new MvxCommand(AttemptLogin, CanExecuteLogin);
return _loginCommand;
}
}
private void AttemptLogin()
{
if (_loginService.Login(Username, Password))
{
ShowViewModel<DashboardStdViewModel>();
}
else
{
_dialogService.Alert("We were unable to log you in!", "Login Failed", "OK");
}
}
private bool CanExecuteLogin()
{
return (!string.IsNullOrEmpty(Username) || !string.IsNullOrWhiteSpace(Username))
&& (!string.IsNullOrEmpty(Password) || !string.IsNullOrWhiteSpace(Password));
}
}
public类LoginViewModel:BaseViewModel
{
专用只读ILoginService(U loginService);
专用只读IDialogService(对话服务);
公共登录视图模型(学校模型项)
{
//_loginService=loginService;
//_dialogService=dialogService;
学校=项目;
Username=“TestUser”;
Password=“YouCantSeeMe”;
IsLoading=false;
}
私立学校模式(学校),;
公立学校示范学校
{
得到
{
返回学校;
}
设置
{
SetProperty(参考学校,价值);
RaiseProperty更改(()=>学校);
}
}
私有字符串\u用户名;
公共字符串用户名
{
得到
{
返回_用户名;
}
设置
{
SetProperty(参考用户名、值);
RaisePropertyChanged(()=>用户名);
}
}
私有字符串\u密码;
公共字符串密码
{
得到
{
返回密码;
}
Mvx.ConstructAndRegisterSingleton<IFoo, Foo>();
public class MyViewModel : MvxViewModel
{
private readonly IMvxNavigationService _navigationService;
public MyViewModel(IMvxNavigationService navigationService)
{
_navigationService = navigationService;
}
public async Task SomeMethod()
{
await _navigationService.Navigate<NextViewModel, MyObject>(new MyObject());
}
}
public class NextViewModel : MvxViewModel<MyObject>
{
private MyObject _myObject;
public override void Prepare(MyObject parameter)
{
// receive and store the parameter here
_myObject = parameter;
}
}
public class SchoolSelectionViewModel : BaseViewModel
{
public void DoSelectItem(SchoolModel item)
{
ShowViewModel<LoginViewModel, SchoolModel>(item);
}
}
public class LoginViewModel : BaseViewModel<SchoolModel>
{
private SchoolModel _parameter;
public override Task Prepare(SchoolModel parameter)
{
// receive and store the parameter here
_parameter = parameter;
}
}
public abstract class BaseViewModel<TParameter> : BaseViewModel, IMvxViewModel<TParameter>
{
public async Task Init(string parameter)
{
if (!string.IsNullOrEmpty(parameter))
{
IMvxJsonConverter serializer;
if (!Mvx.TryResolve(out serializer))
{
throw new MvxIoCResolveException("There is no implementation of IMvxJsonConverter registered. You need to use the MvvmCross Json plugin or create your own implementation of IMvxJsonConverter.");
}
var deserialized = serializer.DeserializeObject<TParameter>(parameter);
Prepare(deserialized);
await Initialize();
}
}
public abstract void Prepare(TParameter parameter);
}
public class SchoolSelectionViewModel : BaseViewModel
{
public void DoSelectItem(SchoolModel item)
{
ShowViewModel<LoginViewModel>(item);
}
}
public class LoginViewModel : BaseViewModel
{
private SchoolModel _parameter;
public override void Init(SchoolModel parameter)
{
// receive and store the parameter here
_parameter = parameter;
}
}