2012-02-06 59 views
1

我现在有一个列表框设置如下:列表框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的错误?

+1

什么是'someString'?它始终是一样的价值吗?我认为如果您每秒按下按钮不止一次,可能会出现平等问题。 – 2012-02-07 01:33:03

+0

我不认为这个价值很重要。是的,按钮测试是一个常数。这是否意味着无法区分具有相同内容的元素?在某些情况下,“真实”数据可能相同,并在一秒钟内添加多次。 – 2012-02-07 04:20:19

+0

价值可能很重要。当您在ListBox中设置SelectedItem时,它将调用其项目上的Equals方法以查找要选择的项目。如果你有两个字符串相同的文本,它将无法弄清楚你的意思,你会得到观察到的行为。 – 2012-02-07 04:23:19

回答

6

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

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

+0

你应该有更多upvotes为此。愚蠢的测试数据...... – JoshHetland 2015-03-11 05:07:49