Проблема выбора ListView — кэширование предотвращает выбор многих элементов

#wpf #listview

#wpf #listview

Вопрос:

У меня проблема с тем, как ListView выбирает свои элементы.

У меня есть ListView, привязанный к ObservableCollection элементов, которые имеют свойство ‘Selected’. Я привязал состояние выбора следующим образом:

 <ListView.ItemContainerStyle>
    <Style TargetType="{x:Type ListViewItem}">
        <Setter Property="IsSelected" Value="{Binding Path=Selected, Mode=TwoWay}" />
    </Style>
</ListView.ItemContainerStyle>
  

Но при наличии примерно 1000 элементов в списке ListView содержит контейнеры только для видимых объектов при запуске или около 500, когда они уже прокручены. Поэтому, даже если я выберу все (Ctrl A), выбор будет установлен только для этих 500.

Я также перепробовал множество других решений, которые приходили мне на ум, но ни одно из них не сработало.

  • ListView.Невозможно привязать выбранные элементы к.
  • Использование события SelectionChanged для установки свойства ‘Selected’ — запускало множество событий SelectionChanged при прокрутке в область, которая не была кэширована во время выбора, и поэтому элементы были «новыми выбранными» для списка.
  • Использование события SelectionChanged в ListView для добавления и удаления измененного выбора в дополнительную коллекцию — Не удалось выбрать из ViewModel, поскольку работает только в одном направлении.

Возможно ли каким-либо образом иметь ListView, где я могу выбрать более 500 элементов и иметь эту информацию где-нибудь в ViewModel. Также должна быть возможность выбора / отмены выбора из ViewModel.

Спасибо

Ответ №1:

Я бы рекомендовал вам использовать шаблон данных для ваших listviewitems, и в этом datatemplate у вас должна быть кнопка проверки или флажок и т.д. (т. Е. элемент управления, который поддерживает состояние). Затем я бы привязал это к вашей viewmodel. Затем я бы сделал так, чтобы вы полностью обходили выбранный вами механизм в вашем элементе управления listview. Вы можете создавать шаблоны для них в своих listviewitems на основе состояния кнопки, которое можно привязать к вашей viewmodel.

Это решение, которое я предлагаю, не является замечательным по сравнению с IsSelected, работающим так, как вы ожидаете. Если вам нужна более аккуратная версия, возможно, вы можете реализовать то, что я предлагаю, в качестве нового инкапсулированного элемента управления, который делает IsSelected наблюдаемым / привязываемым, как вы и ожидали. Возможно, доступные сторонние элементы управления могут поддерживать такое поведение?