Rut*_*hta 4 c# xamarin.ios xamarin.android xamarin xamarin.forms
我有两个选择器。第二个选择器取决于第一个选择器。两个选择器都从Service绑定。我正在使用字典对象将数据绑定到选择器。我没有使用MVVM模式。
System.ArgumentOutOfRangeException:索引超出范围。必须为非负数并且小于集合的大小。
参数名称:索引
全球宣言:
Dictionary<string, string> DicObjActivityType;
Dictionary<string, string> DicObjSelfActivity;
Run Code Online (Sandbox Code Playgroud)
第一选择器selectedIndexChange事件
private async void PckrActivityType_SelectedIndexChanged(object sender, EventArgs e)
{
if (sender as Picker == null)
return;
else
{
var objActivityType = sender as Picker;
var Key = DicObjActivityType.FirstOrDefault(x => x.Value == objActivityType.Items[objActivityType.SelectedIndex]).Key;
PickedActivityType = Key;
if (Key != "0")
{
PckrSelfActivity.IsEnabled = true;
await CallGetWebService_SelfActivity(Key);
if (PckrSelfActivity.IsEnabled == true)
{
PckrSelfActivity.Items.Clear();
foreach (string items in DicObjSelfActivity.Values)
{
PckrSelfActivity.Items.Add(items);
}
}
}
else
{
PckrSelfActivity.IsEnabled = false;
}
}
}
Run Code Online (Sandbox Code Playgroud)
二分拣员的呼叫服务
private async Task CallGetWebService_SelfActivity(string strkey)
{
try
{
var response = await GetResponseFromWebService.GetResponse<ServiceClasses.RootObject_LstListComboData>(ServiceURL.GetSelfActivity + "ActivityTypeCd=" + strkey);
if (response.Flag == true)
{
DicObjSelfActivity = new Dictionary<string, string>();
DicObjSelfActivity.Add("0", "--Select--");
if (response.lstListComboData != null)
{
foreach (ServiceClasses.LstListComboData Items in response.lstListComboData)
{
DicObjSelfActivity.Add(Items.Value, Items.Text);
}
}
}
else
{
PckrSelfActivity.IsEnabled = false;
}
}
catch (Exception e)
{
await DisplayAlert(AppResources.LError, AppResources.LConnectionError, "OK");
}
}
Run Code Online (Sandbox Code Playgroud)
我参考以下链接来解决这个问题
https://forums.xamarin.com/discussion/55922/picker-clear-system-argumentoutofrangeexception
但没有找到解决方案。
我们无法清除选择器是否选择了任何值?
我不想使用BindablePicker定制控件。
我不确定是否通过“清除选择器”来重设它,使其不显示任何选定的项目。但是,如果这是您想要的,则可以执行以下操作:
设置SelectedIndex = -1。这将重置选择器,以便不选择任何项目。
设置之后SelectedIndex = -1,selectedIndexChange事件处理程序将被调用,这将导致
System.ArgumentOutOfRangeException:索引超出范围。必须为非负数并且小于集合的大小。
确实是,SelectedIndex是-1,因此它在抱怨索引必须为非负数。
if语句,该语句将SelectedIndexChange事件处理程序括起来,以便该处理程序仅执行if (SelectedIndexChange != -1)。总而言之,请执行以下操作:
YourPicker.SelectedIndex = -1;
YourPicker.SelectedIndexChanged += (sender, e) =>
{
if (YourPicker.SelectedIndex != -1)
{
//Do your stuff
}
}
Run Code Online (Sandbox Code Playgroud)