我目前正在跨平台的应用程序上工作,而选择器的事件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++;
}
}
}
任何帮助或指导将不胜感激。谢谢。