WPF ListView / GridView ошибка одиночного выбора

2

В 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 toolkit datagrid.

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

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

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

Теги:
wpf
listview

3 ответа

8
Лучший ответ

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

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

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

  • 0
    Ух ты. Это исправило проблему. Большое спасибо. :)
0

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

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

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

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

0

Это старый поток с ответом, но я думал, что добавлю свой собственный опыт.

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

У моего ListView был ItemSource, связанный с коллекцией ObservableCollection.

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

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

Ещё вопросы

Сообщество Overcoder
Наверх
Меню