【问题标题】:How to clear picker if It is selected in xamarin forms?如果在 xamarin 表单中选择它,如何清除选择器?
【发布时间】:2017-04-02 05:58:57
【问题描述】:

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

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

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

参数名称:索引

全球宣言:

Dictionary<string, string> DicObjActivityType;

Dictionary<string, string> DicObjSelfActivity;

First 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 自定义控件。

【问题讨论】:

  • DicObjActivityType 在哪里初始化?和什么价值观。这条线是我认为导致问题的地方 var Key = DicObjActivityType.FirstOrDefault(x => x.Value == objActivityType.Items[objActivityType.SelectedIndex]).Key;
  • 在清除项目之前,您是否尝试过设置 .SelectedIndex=-1? - 我想我以前可能听说过。

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


【解决方案1】:

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

【讨论】:

    【解决方案2】:

    实际上我做了以下事情,对我来说效果很好:

    //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】:

      我不确定“清除选择器”是否意味着重置它以使其不显示任何已选择的项目。但如果这是您想要的,那么您可以执行以下操作:

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

      2. 一旦设置了SelectedIndex = -1selectedIndexChange 事件处理程序就会被调用,这会导致

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

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

      1. 为避免 ArgumentOutOfRangeException,请添加一个包含 SelectedIndexChange 事件处理程序的 if 语句,以便处理程序仅执行
        if (SelectedIndexChange != -1)

      总而言之,这样做:

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

      【讨论】:

        【解决方案4】:

        现在Picker 类使用绑定,您可以使用ItemSource 属性将List 字符串绑定到选择器。我在我的应用程序中解决此问题的方法是创建了一个名为 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,它将显示“占位符”,因为那是它的Title)。

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

        在您的情况下,您可以对Dictionary 执行与List 相同的操作,只需创建一个新的Dictionary,填充它并将其设置为ItemSource

        【讨论】:

          猜你喜欢
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          • 1970-01-01
          相关资源
          最近更新 更多