[英]How to clear picker if It is selected in xamarin forms?
我有兩個選擇器。 第二個選擇器取決於第一個選擇器。 兩個選擇器都從服務綁定。 我正在使用字典對象將數據綁定到選擇器。 我沒有使用 MVVM 模式。
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 自定義控件。
我不確定“清除選擇器”是否是指重置它,使其不顯示任何已選擇的項目。 但是,如果這就是您想要的,那么您可以執行以下操作:
設置SelectedIndex = -1
。 這將重置選擇器,以便不選擇任何項目。
設置SelectedIndex = -1
,將調用selectedIndexChange
事件處理程序,這將導致
System.ArgumentOutOfRangeException:索引超出范圍。 必須是非負的並且小於集合的大小。
確實是的, SelectedIndex
是-1
,所以它抱怨索引必須是非負的。
SelectedIndexChange
事件處理程序的if
語句,以便處理程序僅執行if (SelectedIndexChange != -1)
。總之,這樣做:
YourPicker.SelectedIndex = -1;
YourPicker.SelectedIndexChanged += (sender, e) =>
{
if (YourPicker.SelectedIndex != -1)
{
//Do your stuff
}
}
我認為您收到此錯誤是因為您清理了選擇器中的所有項目。 我有同樣的錯誤,但我現在使用的是 MVVM,它更簡單,你可以更好地管理這種事情。
實際上我做了以下工作,它對我來說很好:
//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;
現在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()
,Picker 將被重置並且不會有被選中的項目(對於myPicker
,它將顯示“Placeholder”,因為這是它的Title
)。
如果您的列表很短,則此解決方案效果很好,這很可能是這種情況。 但是,如果您每次都需要生成一個非常非常大的列表,這可能會很慢。
在您的情況下,您可以對Dictionary
做與我對List
做的相同的事情,只需創建一個新的Dictionary
,填充它,並將其設置為ItemSource
。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.