WPF ListView / GridView ошибка одиночного выбора - PullRequest
2 голосов
/ 25 октября 2009

Странная ошибка в ListView / GridView в WPF, когда для SelectionMode установлено значение Single.

Способы воспроизведения:

Создание коллекции (в коллекции должно быть достаточно элементов, чтобы ListView мог хотя бы прокрутить 2-3 страницы):

var customers = from c in _db.Customers
    orderby c.Name, c.City
     select c;

Привязать коллекцию к ListView:

dataGrid.ItemsSource = customers.ToList();

На первой странице измените свой выбор 3-4 пунктов. Помните, какие предметы вы выбрали ранее. Прокрутите вниз с помощью колесика мыши, чтобы перейти на следующую страницу. Прокрутите назад. Вуаля !! Вы увидите все элементы, которые вы нажали выбранные ?! Изображение этой ошибки: http://img261.imageshack.us/img261/133/listview.jpg

Эта же проблема затрагивает и сетку данных инструментария Wpf.

Еще более странно то, что каждый выбор добавляется к свойству SelectedItems. Поэтому, если вы изменили свой выбор 10 раз, у вас будет 10 элементов в свойстве SelectedItems с текущим выбором в качестве последнего элемента.

Может кто-нибудь сказать мне, почему это происходит? Это предназначено или ошибка? Для меня это больше похоже на ошибку.

Кто-то еще тоже сталкивался с этой ошибкой. Старая статья, но ошибка все еще остается: http://cs.blueberryislandmedia.com/blogs/blueberries/archive/2009/04/24/bug-in-wpf-listview-single-selection-mode.aspx

Ответы [ 3 ]

8 голосов
/ 25 октября 2009

Это интересно и может быть ошибкой. Это такой общий контроль и сценарий, хотя, я подозреваю, что-то еще может происходить. Я нашел одну ссылку на что-то похожее на эту проблему здесь . Совет, данный, чтобы решить это следующим образом:

Если вы переопределяете Equals в объект, который отображается в ListView, сделай это правильно, в противном случае, вы получите все виды интересных поведение ...

Я предполагаю, что теория заключается в том, что ошибка в Equals отбросит логику в ListView. Убедитесь, что вы не переопределяете Equals, и опубликуйте результаты. Если это не так, и вы не получили никакой другой помощи, я рекомендую вам сообщить об этом как ошибка на Microsoft Connect .

0 голосов
/ 05 марта 2014

Мысля об этом старом потоке ... У меня тоже была эта проблема, и да, удаление моих пользовательских переопределений Equals и GetHashCode устранило ее, но, в отличие от цитаты из ответа Джерри, мои методы переопределения Equals и GetHashCode действительно были написаны правильно.

Для меня проблема проявлялась при изменении выбранных данных. Хотя изменение правильно отображалось в ListView, оно оставалось выбранным после этого.

Хотя я не могу найти хорошего объяснения этому, мое личное предположение заключается в том, что код в ListView может предполагать, что данные не изменятся (или, по крайней мере, значение хеша для записи будет не изменяется в зависимости от значения данных) и когда изменяется значение хеш-функции, он не может «найти» запись, чтобы отменить ее выбор). Удаляя пользовательские Equals и GetHashCode, .NET возвращается к более общей версии, которая идентифицирует объект по его ссылке, а не по значениям.

Теперь попробуем DataGrid, чтобы увидеть, работает ли это для меня ...

0 голосов
/ 27 июня 2013

Это старая ветка с ответом, но я решил добавить свой собственный опыт.

У меня была похожая проблема, несколько строк были выделены, хотя SelectionMode моего ListView был один. Поведение было очень спорадическим, и не было связанным с тем, что предметы в коллекции были равны друг другу.

Мой ListView связывал ItemsSource с коллекцией ObservableCollection.

Я обнаружил, что такое поведение присутствовало только тогда, когда в моей коллекции было более 5000 предметов. Я исправил проблему, создав временную коллекцию, а затем установив связанную коллекцию. Это уменьшило количество обновлений в моем ListView до одного обновления.

Возможно, не самое правильное решение, но оно сработало в моем случае и, надеюсь, поможет кому-то еще.

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