我现在有一个列表框设置如下:列表框ScrollIntoView和不可靠的SelectedItem
的.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的错误?
什么是'someString'?它始终是一样的价值吗?我认为如果您每秒按下按钮不止一次,可能会出现平等问题。 – 2012-02-07 01:33:03
我不认为这个价值很重要。是的,按钮测试是一个常数。这是否意味着无法区分具有相同内容的元素?在某些情况下,“真实”数据可能相同,并在一秒钟内添加多次。 – 2012-02-07 04:20:19
价值可能很重要。当您在ListBox中设置SelectedItem时,它将调用其项目上的Equals方法以查找要选择的项目。如果你有两个字符串相同的文本,它将无法弄清楚你的意思,你会得到观察到的行为。 – 2012-02-07 04:23:19