2016-11-18 30 views
3

我有两个选择器。第二选择器依赖于第一选择器。这两个采购员都是来自Service的绑定。我正在使用字典对象将数据绑定到选取器。 我没有使用MVVM模式。如何清除选择器,如果它在xamarin表单中被选中?

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

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

参数名:指数

全球宣言:第二选择器的

Dictionary<string, string> DicObjActivityType; 

Dictionary<string, string> DicObjSelfActivity; 

第一拾取器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控件。

+0

DicObjActivityType initalised在哪里?并以什么价值。这条线将是我认为会导致问题的地方 var Key = DicObjActivityType.FirstOrDefault(x => x.Value == objActivityType.Items [objActivityType.SelectedIndex])。 – InitLipton

+0

在清除项目之前,您是否尝试过设置.SelectedIndex = -1? - 我想我以前可能已经明白了这一点。 –

回答

0

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

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; 
1

我不知道,如果通过“清除装载机”你的意思是复位,使其不显示任何项目,如选择。但如果这是你想要的,那么你就可以做到以下几点:

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

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

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

确实是的,SelectedIndex-1,所以它的抱怨,该指数必须为非负数。

  • 为了避免ArgumentOutOfRangeException,添加if声明包围你的SelectedIndexChange事件处理程序,使处理器仅执行
    if (SelectedIndexChange != -1)
  • 总之,这样做:

    YourPicker.SelectedIndex = -1; 
    YourPicker.SelectedIndexChanged += (sender, e) => 
    { 
        if (YourPicker.SelectedIndex != -1) 
        { 
         //Do your stuff 
        } 
    } 
    
    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,它将显示“占位符”,因为它是它的Title)。

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

    在你的情况,你可以做同样的事情与Dictionary像我一样用List,只需创建一个新Dictionary,填充它,并将它设置为ItemSource

    相关问题