簡體   English   中英

如果以 xamarin 形式選擇它,如何清除選擇器?

[英]How to clear picker if It is selected in xamarin forms?

我有兩個選擇器。 第二個選擇器取決於第一個選擇器。 兩個選擇器都從服務綁定。 我正在使用字典對象將數據綁定到選擇器。 我沒有使用 MVVM 模式。

  1. 第一個服務調用,其中綁定了第一個選擇器的字典對象。
  2. 然后從該字典對象中填充第一個選擇器。 那時第二個選擇器是空的。
  3. 在第一個選擇器調用服務的 selectedIndexChange 事件上綁定第二個選擇器的字典對象。
  4. 現在將值從字典對象填充到第二個選擇器。 (如果已經選擇器有數據,則放置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 自定義控件。

我不確定“清除選擇器”是否是指重置它,使其不顯示任何已選擇的項目。 但是,如果這就是您想要的,那么您可以執行以下操作:

  1. 設置SelectedIndex = -1 這將重置選擇器,以便不選擇任何項目。

  2. 設置SelectedIndex = -1 ,將調用selectedIndexChange事件處理程序,這將導致

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
    }
}

我認為您收到此錯誤是因為您清理了選擇器中的所有項目。 我有同樣的錯誤,但我現在使用的是 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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM