如果在xamarin表格中选择它,如何清除选择器?

时间:2016-11-18 11:36:56

标签: c# xamarin xamarin.ios xamarin.android xamarin.forms

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

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

    System.ArgumentOutOfRangeException:索引超出范围。一定是   非负面且小于集合的大小。

         

    参数名称:index

    全球宣言:

    Dictionary<string, string> DicObjActivityType;
    
    Dictionary<string, string> DicObjSelfActivity;
    

    第一个Picker 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;
                    }
                }
            }
    

    拨打第二个选择器的服务

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

    我参考以下链接来解决此问题

    https://forums.xamarin.com/discussion/55922/picker-clear-system-argumentoutofrangeexception

    但没有找到解决方案。

    如果选择了任何值,我们无法清除选择器吗?

    我不想使用BindablePicker cutom控件。

4 个答案:

答案 0 :(得分:3)

我不确定“清除选择器”是否意味着重置它以使其不显示任何选定的项目。但如果这就是你想要的,那么你可以做到以下几点:

  1. 设置SelectedIndex = -1。这会重置选择器,使得没有选择任何项目。

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

  3.   

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

    确实是的,SelectedIndex-1,所以它抱怨索引必须是非负数。

    1. 要避免ArgumentOutOfRangeException,请添加一个if语句,其中包含SelectedIndexChange事件处理程序,以便处理程序仅执行
      if (SelectedIndexChange != -1)
    2. 总之,请执行以下操作:

      YourPicker.SelectedIndex = -1;
      YourPicker.SelectedIndexChanged += (sender, e) =>
      {
          if (YourPicker.SelectedIndex != -1)
          {
              //Do your stuff
          }
      }
      

答案 1 :(得分:0)

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

答案 2 :(得分:0)

实际上我做了以下工作,它对我来说很好:

//step 1: re-select index to -1
YourPicker.SelectedIndex = -1;
//step 2: clear all items
YourPicker.Items.Clear();
//refill the picker 
foreach (var item in subAccountStatus)
{
    YourPicker.Items.Add(item.AccountStatus);                  
}
//re-selected index to first item
YourPicker.SelectedIndex = 0;

答案 3 :(得分:0)

现在Picker类使用绑定,您可以使用List属性将ItemSource个字符串绑定到选择器。我在应用程序中解决此问题的方法是创建了一个名为GeneratePickerSource()

的辅助方法

这是我在XAML中的Picker

<Picker x:Name="myPicker" Title="Placeholder"/>

然后我的GeneratePickerSource()方法:

List<string> pickerStrings = new List<string>();

//Add your picker options to the list

myPicker.ItemSource = pickerStrings;

通过使用此方法,无论何时拨打GeneratePickerSource(),都会重置选择器并且没有选定项目(对于myPicker,它会显示&#34;占位符&#34;因为那样是Title)。

如果您的列表很短,此解决方案很有效,这很可能就是这种情况。但如果每次都需要生成非常大的列表,这可能会很慢。

在您的情况下,您可以使用Dictionary执行与List相同的操作,只需创建一个新的Dictionary,填写它,然后将其设置为{ {1}}。