Список ListView Items пуст, но в SelectedItems все еще есть элементы (C# / wpf)

У меня есть ListView, который привязан к CollectionViewSource (источником которого является ObservableCollection. myList в примере ниже).

<CollectionViewSource x:Key = "cvs" Source = "{Binding myList}" IsLiveGroupingRequested=true />

<ListView Name = "itemsList"
                  SelectionMode = "Extended"
                  Margin = "0,0,5,0"
                  ItemsSource = "{Binding Source = {StaticResource cvs}}"
                  SelectionChanged = "itemsList_SelectionChanged"
                  ScrollViewer.HorizontalScrollBarVisibility = "Disabled"
                  ScrollViewer.CanContentScroll = "False"                      
            <ListView.ItemContainerStyle>
                <Style TargetType = "{x:Type ListViewItem}" BasedOn = "{StaticResource {x:Type ListViewItem}}">
                    <Setter Property = "IsSelected" Value = "{Binding IsSelected, Mode=TwoWay}"/>
                </Style>
            </ListView.ItemContainerStyle>
</ListView>

Выбираю один пункт в списке.

Проблема, с которой я столкнулся, заключается в том, что когда я очищаю коллекцию ItemsSource. Если я использую myList.Clear(), коллекция itemsList.Items будет пустой, как и ожидалось, но в itemsList.SelectedItems все еще будет выбранный элемент. Я отменил выбор элемента, используя его свойство IsSelected, и это не сработало. Даже после того, как я сделаю itemsList.SelectedItems.Clear()/RemoveAt(0)/UnselectAll(), в нем все еще есть один выбранный элемент.

Любая помощь приветствуется. Спасибо

Вы пробовали itemsList.SelectedItem = null?

maulik kansara 23.03.2018 07:27

Не могли бы вы предоставить полный рабочий пример, чтобы мы могли воспроизвести ошибку?

Eike B 23.03.2018 09:12
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
1
2
269
1

Ответы 1

Это происходит, когда коллекция .Source из CollectionViewSourceне генерирует событие CollectionChanged очищается. Например, если источником является простой ArrayList (который не уведомляет об изменениях), то поведение будет таким, как вы описали.

Без отправки соответствующего события ListView не знает, что ему следует обновить свой внутренний кэш элементов и список выбранных элементов.

(С другой стороны, свойство .Items, похоже, фактически проверяет источник каждый раз при его вызове, поэтому оно будет сообщать о .Count из 0, если источник был очищен.)

Чтобы распространить изменение myList.Clear() на CollectionViewSource и ListView, убедитесь, что myList действительно реализует INotifyCollectionChanged и правильно излучает CollectionChanged всякий раз, когда он очищается.

Спасибо тебе за это. myList - это ObservableCollection, поэтому он будет реализовывать INotifyCollectionChanged. Также я не понимаю, почему вызов listview.SelectedItems.Clear () явно не очищает список.

ababeel 24.03.2018 14:19

@ababeel Было бы мило с вашей стороны принять правильный ответ. Если вы хотите очистить список, вы должны так или иначе уведомить ListView о последних изменениях. ... SelectedItems.Clear () не уведомляет об этом. Вы все равно должны вызвать RaisePropertyChanged ("yourList") после его очистки.

MaxB 26.03.2018 13:08

@ababee: Странно, если я подключу ваш фрагмент XAML к myList типа ObservableCollection, ListView отлично отреагирует на myList.Clear(). Возможно, в части вашего кода есть ошибка, которую вы не показали. Можете ли вы создать минимальную автономную программу, которая обнаруживает проблему?

smls 26.03.2018 13:53

@smls спасибо, да, я работаю над примером, который демонстрирует проблему.

ababeel 31.03.2018 12:11

Другие вопросы по теме