Asynchronous Xamarin表单-重新加载页面时填充两个异步选择器错误

Asynchronous Xamarin表单-重新加载页面时填充两个异步选择器错误,asynchronous,xamarin,xamarin.forms,picker,Asynchronous,Xamarin,Xamarin.forms,Picker,第二个取决于第一个选择器SelectedIndexChanged事件 我需要先设置每个选择器的源,然后设置任何用户首选项,以便使用正确的值选择每个选择器。我试过很多方法,但我不知道最好的方法。以下是我目前正在做的事情 用于填充每个下拉列表的方法是异步的,因此我必须执行以下操作: public UserPreferencesPage() { InitializeComponent(); BindingContext = viewModel = new Use

第二个取决于第一个选择器SelectedIndexChanged事件

我需要先设置每个选择器的源,然后设置任何用户首选项,以便使用正确的值选择每个选择器。我试过很多方法,但我不知道最好的方法。以下是我目前正在做的事情

用于填充每个下拉列表的方法是异步的,因此我必须执行以下操作:

public UserPreferencesPage()
    {
        InitializeComponent();
        BindingContext = viewModel = new UserPreferencesViewModel();



    }

    protected async override void OnAppearing()
    {
        base.OnAppearing();

        await LoadData();
        await SetPreferences();



    }

    private async Task LoadData()
    {

        await viewModel.LoadPreferenceData();
        await viewModel.LoadServiceData();
       if (!string.IsNullOrEmpty(viewModel.UserPreferences.ServiceCode))
        {
            await viewModel.LoadTeamClinicianData(viewModel.UserPreferences.ServiceCode);
        }

    }
    private async Task SetPreferences()
    {
        try
        {


        var serviceCode = viewModel.UserPreferences.ServiceCode;

        ServicePicker.SelectedIndex = viewModel.Services.IndexOf(viewModel.Services.Where(x => x.ServiceCode == serviceCode).FirstOrDefault());

        }
        catch (Exception ex)
        {

            throw;
        }

    }


    private async void ServicePicker_SelectedIndexChanged(object sender, EventArgs e)
    {
        var TeamClinicianCode = viewModel.UserPreferences.TeamClinicianCode;
        //    //save preference
        if (ServicePicker.SelectedItem != null)
        {
            viewModel.UserPreferences.ServiceCode = ((Service)ServicePicker.SelectedItem).ServiceCode.Trim();
           var a = await App.Database.SaveUserPreferenceAsync(viewModel.UserPreferences);
            //Load Dropdown
            if (!string.IsNullOrEmpty(viewModel.UserPreferences.ServiceCode))
            {
                viewModel.UserPreferences.TeamClinicianCode = string.Empty;

                await viewModel.LoadTeamClinicianData(viewModel.UserPreferences.ServiceCode);
                TeamClinicianPicker.SelectedIndex = viewModel.TeamClinicians.IndexOf(viewModel.TeamClinicians.Where(x => x.Code.Trim() == TeamClinicianCode.Trim()).FirstOrDefault());

                var b = await App.Database.SaveUserPreferenceAsync(viewModel.UserPreferences);
            }
        }
    }

    private async void TeamClinicianPicker_SelectedIndexChanged(object sender, EventArgs e)
    {
        //    //save preference
        viewModel.UserPreferences.TeamClinicianCode = ((TeamClinican)TeamClinicianPicker.SelectedItem).Code.Trim();
        var a = await App.Database.SaveUserPreferenceAsync(viewModel.UserPreferences);
    }
第一次加载页面时,它会正确加载并设置值。第二次加载页面时,出现了一个null异常,但我无法正确调试,因为它在iOS项目中

我在iOS中使用Xamarin表单


如果您指的是作为第二次页面加载导航回来,请多谢!那么就不应该有任何问题,因为它被保留在内存中。如果您在MAC(Visual studio)或Visual studio的“输出”选项卡上工作,请查看“应用程序输出”选项卡。它应该包含例外情况的最少详细信息。我认为问题在于ServicePicker\u SelectedIndexChanged不需要在页面加载上运行,只有在用户更改页面加载时才需要运行。有更好的设计吗?我怀疑这不能成为不改变SelectedIndex事件不会被触发的原因。尽管如此,我还是建议遵循MVVM->Binding,这样您就不必每次都依赖于出现的事件和加载数据?我尝试过,但发现很难根据另一个选择器设置一个选择器这是一个很好的例子:但它没有显示第二个下拉列表是如何刷新的。如果您指的是作为第二次页面加载导航回来!那么就不应该有任何问题,因为它被保留在内存中。如果您在MAC(Visual studio)或Visual studio的“输出”选项卡上工作,请查看“应用程序输出”选项卡。它应该包含例外情况的最少详细信息。我认为问题在于ServicePicker\u SelectedIndexChanged不需要在页面加载上运行,只有在用户更改页面加载时才需要运行。有更好的设计吗?我怀疑这不能成为不改变SelectedIndex事件不会被触发的原因。尽管如此,我还是建议遵循MVVM->Binding,这样您就不必每次都依赖于出现的事件和加载数据?我试过了,但发现很难根据另一个选择器设置一个选择器。这是一个很好的例子:但它没有显示第二个下拉列表是如何刷新的。