ListBox ScrollIntoView和SelectedItem不可靠

本文关键字:不可靠 SelectedItem ScrollIntoView ListBox | 更新日期: 2023-09-27 18:23:47

我目前有一个列表框设置如下:

.xaml:

<ListBox Name="DetailsList" ItemsSource="{Binding}" LayoutUpdated="DetailsList_LayoutUpdated" />

.xaml.cs:

private ObservableCollection<string> details = new ObservableCollection<string>();

窗口内构造函数:

DetailsList.DataContext = details;

我有一个按钮可以执行以下操作:

details.Add(System.DateTime.Now.ToString("HH:mm:ss ") + someString);
DetailsList.UpdateLayout();
var lastItem = DetailsList.Items[DetailsList.Items.Count - 1];
DetailsList.SelectedItem = lastItem;
DetailsList.ScrollIntoView(lastItem);

应该选择列表中的最后一项并滚动到它,但它只在75%左右的时间内这样做。相反,它通常会选择倒数第二个,然后滚动到该位置。

我尝试将滚动和选择移动到LayoutUpdated事件处理程序中,没有任何更改。

我试了两个单独的按钮——一个用来添加,一个用来选择和滚动。如果我一次添加一个项目,然后滚动,它似乎更可靠——90%的时间都有效。如果我在滚动之前添加六个项目,它几乎永远不会起作用。它通常会选择其中一个新项目,但不会选择最后一个。

我是做错了什么,还是System.Windows.Controls.ListBox有错误?

ListBox ScrollIntoView和SelectedItem不可靠

问题是已经向列表中添加了多个具有相同字符串值的项。在ListView上设置SelectedItem属性时,它将调用Equals方法来查找正确的项。它将选择Equals返回true的第一个项目,这就是您获得观察到的行为的原因。

您需要添加唯一的字符串(例如,添加毫秒)或将它们包装在另一个类中,以便能够唯一地标识它们。