У меня есть 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(), в нем все еще есть один выбранный элемент.
Любая помощь приветствуется. Спасибо
Не могли бы вы предоставить полный рабочий пример, чтобы мы могли воспроизвести ошибку?





Это происходит, когда коллекция .Source из CollectionViewSourceне генерирует событие CollectionChanged очищается. Например, если источником является простой ArrayList (который не уведомляет об изменениях), то поведение будет таким, как вы описали.
Без отправки соответствующего события ListView не знает, что ему следует обновить свой внутренний кэш элементов и список выбранных элементов.
(С другой стороны, свойство .Items, похоже, фактически проверяет источник каждый раз при его вызове, поэтому оно будет сообщать о .Count из 0, если источник был очищен.)
Чтобы распространить изменение myList.Clear() на CollectionViewSource и ListView, убедитесь, что myList действительно реализует INotifyCollectionChanged и правильно излучает CollectionChanged всякий раз, когда он очищается.
Спасибо тебе за это. myList - это ObservableCollection, поэтому он будет реализовывать INotifyCollectionChanged. Также я не понимаю, почему вызов listview.SelectedItems.Clear () явно не очищает список.
@ababeel Было бы мило с вашей стороны принять правильный ответ. Если вы хотите очистить список, вы должны так или иначе уведомить ListView о последних изменениях. ... SelectedItems.Clear () не уведомляет об этом. Вы все равно должны вызвать RaisePropertyChanged ("yourList") после его очистки.
@ababee: Странно, если я подключу ваш фрагмент XAML к myList типа ObservableCollection, ListView отлично отреагирует на myList.Clear(). Возможно, в части вашего кода есть ошибка, которую вы не показали. Можете ли вы создать минимальную автономную программу, которая обнаруживает проблему?
@smls спасибо, да, я работаю над примером, который демонстрирует проблему.
Вы пробовали itemsList.SelectedItem = null?