Xamarin Forms清除选择器选项

3

我刚开始使用Xamarin,同时学习C#和XAML,所以这是一次很好的学习经验。我试图完成一个看起来很简单的任务(清除选择器的选择),但结果却变得非常具有挑战性。

期望功能:一个带有选择器的页面,在该页面上进行选择并将其保存到一个变量中,在移动到其他页面后清除所做的选择,这样当返回到第一个页面时就没有所选内容。

我尝试使用picker.Items.Clear()和将SelectedIndex设置为-1,但我始终得到“OutOfRange异常”。我尝试过此文章,但无法使任何选项正常工作:如何在Xamarin Forms中清除选择器?

我不想把选择器设置为第一个选项,而是想让它为空,这样就可以显示选择器标题,这就是它第一次运行时的工作方式,但是当我进行选择并移动到下一页时,当我回来时,我的最初选择仍然存在。

希望上述都能理解我想要实现的内容。以下是我的基本代码,任何帮助或方向都将不胜感激。

MainPage.xaml:

<StackLayout>
        <Label Text="Select an option:" 
            VerticalOptions="Start" 
            HorizontalOptions="Start" 
        />

        <Picker x:Name="OptionSelect"
            Title="Click to Select"
            SelectedIndexChanged="OptionSelect_OnSelectedIndexChanged"
        />      
</StackLayout>

MainPage.xaml.cs:

    public MainPage()
    {
        InitializeComponent();

        OptionSelect.Items.Add("Option 1");
        OptionSelect.Items.Add("Option 2");
        OptionSelect.Items.Add("Option 3");
    }

    public void OptionSelect_OnSelectedIndexChanged(object sender, EventArgs e)
    {
        var option = OptionSelect.Items[OptionSelect.SelectedIndex];

        //OptionSelect.Items.Clear();
        //OptionSelect.Items.Add("Option 1");
        //OptionSelect.Items.Add("Option 2");
        //OptionSelect.Items.Add("Option 3");

        //OptionSelect.SelectedIndex = -1;

        Navigation.PushAsync(new Page1());
    }
1个回答

1

清除选择器的选择?

Picker 实例上设置 SelectedItem 属性为 null

因此,在使用您的代码示例并防止在分配 null 时重新触发 OnSelectedIndexChanged 事件:

public void OptionSelect_OnSelectedIndexChanged(object sender, EventArgs e)
{
    var option = OptionSelect.SelectedItem;
    // Prevent setting the SelectedItem from refiring event
    OptionSelect.SelectedIndexChanged -= OptionSelect_OnSelectedIndexChanged;
    OptionSelect.SelectedItem = null;
    OptionSelect.SelectedIndexChanged += OptionSelect_OnSelectedIndexChanged;
    // Do something with option object
}

太棒了,这起作用了。我还不明白 -= 和 += 是如何工作的,但我认为使用它会导致一个小问题:在进行选项选择并移动到页面1后,我必须点击两次导航页面返回按钮才能回到起始页面。你有什么想法为什么会发生这种情况吗?谢谢! - Mr.T
@Mr.T -=+= 如何工作 当您将 .SelectedItem 设置为新值时,它的索引更改事件会触发,因此通过删除处理程序,您可以避免在将其设置为 null 时第二次调用它。关于页面问题,您是否只调用了 .PushAsync(new Page1()); 一次? - SushiHangover
感谢您的解释。您在页面问题上是正确的方向,我只调用了一次.PushAsync(new Page1());,但似乎当我将其设置为null时,更改事件再次触发,从而再次调用推送。我添加了一个检查null的条件来确定何时移动到Page1,这似乎解决了问题。 - Mr.T

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接