Xamarin Picker selectedItem事件不断触发

时间:2018-07-12 13:19:49

标签: c# xamarin events picker

我目前正在跨平台的应用程序上工作,而选择器的事件SelectedIndexChanged遇到了问题。

这是我的 XAML 文件中的选择器:

<Picker x:Name="actorPicker" Title="Actors" IsVisible="False" ItemsSource=" {Binding ActorsCastAvailable}" ItemDisplayBinding="{Binding Surname}" SelectedIndexChanged="PickerActor_SelectedIndexChanged" AbsoluteLayout.LayoutBounds="0.5, 0.5, 0.4, 0.2" AbsoluteLayout.LayoutFlags="All"/>

然后有一个按钮,可用于将焦点设置在选择器上。选择器集中之后,它将显示所有可用选项,选择之后,该选项将从选择器中删除并添加到ListView中。现在,如果我按顺序在Picker中选择了选项(第一个选项,第二个选项,依此类推),就没有问题,但是如果我尝试第一次选择该选项中的 last option Picker,我遇到两个不同的问题。 如果事件处理程序如下所示:

private void PickerActor_SelectedIndexChanged(object sender, EventArgs e)
    {
            ViewModel.SelectedActor.Execute(sender as Picker);
            actorPicker.SelectedIndexChanged -= PickerActor_SelectedIndexChanged;
            actorPicker.SelectedItem = null;
            actorPicker.SelectedIndexChanged += PickerActor_SelectedIndexChanged;            
    }

完全像此解决方案xamarin forms clear picker selection中所述,我得到了 System.ArgumentOutOfRangeException:索引超出范围。必须为非负数并且小于集合的大小。

如果相反,我将以这种方式更改代码:

private void PickerActor_SelectedIndexChanged(object sender, EventArgs e)
    {
        if (actorPicker.SelectedIndex != -1)
        {
            ViewModel.SelectedActor.Execute(sender as Picker);
            actorPicker.SelectedIndexChanged -= PickerActor_SelectedIndexChanged;
            actorPicker.SelectedIndexChanged += PickerActor_SelectedIndexChanged;
        }            
    }

该异常消失,但事件一直触发,直到将选择器绑定到的Collection为空,并将所有选项添加到ListView。

这是命令 SelectedActor.Execute(...)的方法,用于处理ViewModel中的逻辑:

private void ActorCompleted(Picker picker)
    {
       Actor = (Actor)picker.SelectedItem;
        if (Actor != null)
        {
            bool found = false;
            int iterator = 0;
            while(iterator < ActorsCastAvailable.Count && !found)
            {
                if (Actor._id.Equals(ActorsCastAvailable[iterator]._id))
                {
                    ActorsCastAvailable.RemoveAt(iterator);
                    found = true;
                }
                iterator++;
            }
        }            
    }

任何帮助或指导将不胜感激。谢谢。

0 个答案:

没有答案
相关问题