Asynchronous Xamarin表单-重新加载页面时填充两个异步选择器错误
第二个取决于第一个选择器SelectedIndexChanged事件 我需要先设置每个选择器的源,然后设置任何用户首选项,以便使用正确的值选择每个选择器。我试过很多方法,但我不知道最好的方法。以下是我目前正在做的事情 用于填充每个下拉列表的方法是异步的,因此我必须执行以下操作:Asynchronous Xamarin表单-重新加载页面时填充两个异步选择器错误,asynchronous,xamarin,xamarin.forms,picker,Asynchronous,Xamarin,Xamarin.forms,Picker,第二个取决于第一个选择器SelectedIndexChanged事件 我需要先设置每个选择器的源,然后设置任何用户首选项,以便使用正确的值选择每个选择器。我试过很多方法,但我不知道最好的方法。以下是我目前正在做的事情 用于填充每个下拉列表的方法是异步的,因此我必须执行以下操作: public UserPreferencesPage() { InitializeComponent(); BindingContext = viewModel = new Use
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,这样您就不必每次都依赖于出现的事件和加载数据?我试过了,但发现很难根据另一个选择器设置一个选择器。这是一个很好的例子:但它没有显示第二个下拉列表是如何刷新的。