Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/261.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 在mvvmcross中从一个viewmodel导航到另一个viewmodel时崩溃_C#_Xamarin_Mvvm_Xamarin.ios_Mvvmcross - Fatal编程技术网

C# 在mvvmcross中从一个viewmodel导航到另一个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

我想使用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代码:

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;
    }
}