我有一个包含一些元素的列表框。在我的Page.XAML页面中,我有类似的东西:
<ListBox SelectionMode="Single" SelectionChanged="SelectedIndexChanged" x:Name="myList" HorizontalAlignment="Center" Margin="0,0,0,0" Width="350" Height="900" BorderThickness="0,0,0,0" RequestedTheme="Default" VerticalAlignment="Top" FontSize="20" IsDoubleTapEnabled="False" IsHoldingEnabled="False" IsRightTapEnabled="False" Background="Transparent">
我创建了SelectedIndexChanged事件,以检查单击列表框的一个元素时的情况:
Page.XAML.cs
private async void SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
{
int itemIndex = myList.SelectedIndex;
var messageDialog = new MessageDialog("What do you want to do?", "Alert!");
messageDialog.Commands.Add(new UICommand("Do It", null));
messageDialog.Commands.Add(new UICommand("Don't do it", null));
messageDialog.Commands.Add(new UICommand("Cancel", null));
var cmdClick = await messageDialog.ShowAsync();
Debug.WriteLine(itemIndex);
if (cmdClick.Label == "Do It")
{
Debug.WriteLine("Do It");
myList.Items.RemoveAt(itemIndex);
return;
}
if (cmdClick.Label == "Don't do it")
{
Debug.WriteLine("No defect");
myList.Items.RemoveAt(itemIndex);
return;
}
if (cmdClick.Label == "Cancel")
{
Debug.WriteLine("Cancel");
return;
}
}
一切似乎都是正确的,但是当我单击窗口对话框的一个按钮时(在选择了列表框的一个元素之后),窗口对话框总共再次出现了两次,而不仅仅是返回主窗口。
有什么我想念的吗?
谢谢
答案 0 :(得分:1)
正如Gian Paolo在评论中指出的,由于您要从列表中删除选定的项目,因此会触发第二个事件。
当您删除当前选择的项目时,
SelectedIndex
设置为默认值 -1 。因此,如果用户选择了 索引为 X 的项目,删除后该项目将更改为 -1 ,因此 触发SelectedIndexChanged
事件。
-1 SelectedIndex
表示列表中当前没有选定的项目。
因此解决此问题的最简单方法是仅添加检查以查看所选索引是否为-1。
private async void SelectedIndexChanged(object sender, SelectionChangedEventArgs e)
{
int itemIndex = myList.SelectedIndex;
//checking if the selected index is -1 (or no item is actually selected)
if (itemIndex != -1)
{
var messageDialog = new MessageDialog("What do you want to do?", "Alert!");
messageDialog.Commands.Add(new UICommand("Do It", null));
messageDialog.Commands.Add(new UICommand("Don't do it", null));
messageDialog.Commands.Add(new UICommand("Cancel", null));
var cmdClick = await messageDialog.ShowAsync();
Debug.WriteLine(itemIndex);
if (cmdClick.Label == "Do It")
{
Debug.WriteLine("Do It");
myList.Items.RemoveAt(itemIndex);
return;
}
if (cmdClick.Label == "Don't do it")
{
Debug.WriteLine("No defect");
myList.Items.RemoveAt(itemIndex);
return;
}
if (cmdClick.Label == "Cancel")
{
Debug.WriteLine("Cancel");
return;
}
}
}
希望这会有所帮助!