WPF ListBox 的 SelectionChanged 事件

6

我有一个关于listbox的问题。在我的程序中,当我点击一个ListBoxItem时,我想要在打开窗口之前先预订它。但问题是它首先触发事件,然后再改变选择。代码:

private void LB_Playlist_SelectionChanged(object sender, SelectionChangedEventArgs e)
    {
        if (LB_Playlist.SelectedItem != null)
        {
            try
            {
                List<string> _tempList = new List<string>();
                File_Load_List(LB_Playlist.SelectedItem.ToString(), _tempList);
                LoadListIntoBox(_tempList);
                G_SongList.Visibility = Visibility.Visible;
                AnimationMove(G_Playlist, G_Playlist.Margin, new Thickness(-264, 0, 0, 0), AnimationDuration, true);
                AnimationMove(G_SongList, new Thickness(264, 0, 0, 0), new Thickness(0, 0, 0, 0), AnimationDuration, false);

            }
            catch (Exception ex)
            {
                MessageBox.Show(ex.ToString());
            }
        }
    }

当我尝试使用MessageBox.Show(LB_Playlist.SelectedIndex.ToString())时,它能够正常工作,选项也被改变了,但是消息没有显示。有没有办法改变这种情况?

3个回答

6
`SelectionChangedEventArgs`将包含哪个项目被取消选择和哪个项目被选中。使用`e.AddedItems`获取新选择的项目。例如:
var addedItems = e.AddedItems;
if(addedItems.Count > 0)
{
    var selectedItem = addedItems[0];
    File_Load_List(selectedItem.ToString(), _tempList);
}

这样做可以避免担心事件是在更新控件之前还是之后被引发,但您确实知道事件参数包含正确的信息。

它没有正常工作。选择确实会改变,但不是应该改变的方式。如果我理解正确,它会得到最后一个选择而不是新的选择。 - Kuba Wasilczyk

0
通过MessageBox调用,你可能允许UI在你的代码执行之前更新并更改选择。
你应该能够删除sleep,并使用
File_Load_List(LB_Playlist.SelectedItem.Content.ToString(), _tempList);

内容不存在。 - Kuba Wasilczyk

-3
解决了。只需在try&catch之前添加Thread.Sleep(70)即可。

6
我建议不要这么做,因为这仍然是不确定的行为。在最慢的计算机上,70毫秒的延迟是否足够? - Lukazoid
我一点头绪也没有。在我的快速电脑上运行良好。我认为它会导致仍然必须等待70毫秒才能获取当前选择。仍在等待帮助。 - Kuba Wasilczyk
好吧,这很离谱,但它能用。在我找到更好的解决方案之前,我会继续使用它。 - Tim

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