我目前有一个列表框设置如下:
的.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有错误吗?
答案 0 :(得分:7)
问题是列表中添加了多个具有相同字符串值的项目。在SelectedItem
上设置ListView
属性时,它会调用Equals
方法来查找正确的项目。它将选择Equals
返回true的第一个项目,这就是您获得观察到的行为的原因。
您需要添加唯一的字符串(例如,添加毫秒)或将它们包装在另一个类中以便能够唯一地识别它们。