ListView Items列表为空,但SelectedItems仍然包含元素(c#/ wpf)

时间:2018-03-22 22:30:08

标签: 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()之后,它仍然有一个选定的项目。

非常感谢任何帮助。 感谢

1 个答案:

答案 0 :(得分:0)

.Source CollectionViewSource集合在清除后无法发出CollectionChanged事件时会发生这种情况。例如,当源是简单的ArrayList(不通知更改)时,行为将如您所述。

如果没有发出相应的事件,ListView不知道它应该更新其内部项目缓存和选定的项目列表。

(另一方面,.Items属性似乎每次调用时都会检查源,因此如果源已经过.Count,它将报告0 myList.Clear()清除。)

为了将CollectionViewSource更改传播到ListViewmyList,请确保INotifyCollectionChanged实际上是实现CollectionChanged并正确发出{ {1}}每当它被清除。