ListBox ScrollIntoView и SelectedItem ненадежны - PullRequest
2 голосов
/ 07 февраля 2012

В настоящее время у меня есть список, настроенный следующим образом:

.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 Ответ

7 голосов
/ 07 февраля 2012

Проблема в том, что в список было добавлено несколько элементов с одинаковым строковым значением.При установке свойства SelectedItem для ListView он вызовет метод Equals, чтобы найти правильный элемент.Он выберет первый элемент, для которого Equals возвращает true, поэтому вы наблюдаете наблюдаемое поведение.

Вам необходимо добавить уникальные строки (например, добавить миллисекунды) или обернуть их в другом классе, чтобы иметь возможностьчтобы однозначно идентифицировать их.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...