如果以xamarin形式选择它,如何清除选择器?

Rut*_*hta 4 c# xamarin.ios xamarin.android xamarin xamarin.forms

我有两个选择器。第二个选择器取决于第一个选择器。两个选择器都从Service绑定。我正在使用字典对象将数据绑定到选择器。我没有使用MVVM模式。

  1. 第一次服务调用,其中绑定了第一个选择器的字典对象。
  2. 然后从该字典对象中填充第一个选择器。那时,第二选择器为空。
  3. 在第一个选择器调用服务的selectedIndexChange事件上,以绑定第二个选择器的字典对象。
  4. 现在,将值从字典对象填充到第二个选择器。(如果选择器已经有数据,则将Picker.Items.clear()
  5. 现在,如果我从第二个选择器中选择一个值并更改第一个选择器的值,则它在Picker.Items.clear()中给我错误

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定制控件。

Fri*_*Lim 5

我不确定是否通过“清除选择器”来重设它,使其不显示任何选定的项目。但是,如果这是您想要的,则可以执行以下操作:

  1. 设置SelectedIndex = -1。这将重置选择器,以便不选择任何项目。

  2. 设置之后SelectedIndex = -1selectedIndexChange事件处理程序将被调用,这将导致

System.ArgumentOutOfRangeException:索引超出范围。必须为非负数并且小于集合的大小。

确实是,SelectedIndex-1,因此它在抱怨索引必须为非负数。

  1. 为避免ArgumentOutOfRangeException,请添加一条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)


Enr*_*ico 0

我认为您收到此错误是因为您清理了选择器中的所有项目。我有同样的错误,但我现在使用 MVVM,它更简单,你可以更好地管理这种事情。