我在 VM 中有一个 ObservableCollection,它显示在 ListView 的视图中。当所选项目发生变化时,SelectionChanged 事件会很好地触发。以下是我配置 ListView 的方式:
<ListView Grid.Row="3" Margin="5" AlternationCount="2" Name="_lvSettings"
IsSynchronizedWithCurrentItem="True"
ItemsSource="{Binding Path=CollectionView}"
SelectedIndex="{Binding Path=SelectedSettingIndex}"
SelectionChanged="OnSelectionChanged" >
<ListView.View>
<GridView>
<GridViewColumn Width="170"
Header="{Binding Path=ShowAllDisplay}"
x:Name="_colSettings"
DisplayMemberBinding="{Binding Path=Setting}"/>
<GridViewColumn Header="Old Value" Width="150"
DisplayMemberBinding="{Binding Path=OldVal}"/>
<GridViewColumn Header="New Value"
DisplayMemberBinding="{Binding Path=NewVal}" />
</GridView>
</ListView.View>
</ListView>
我遇到的问题是当我更改集合上的过滤器时。选中的项目保持不变,这很好,但是 ListView 从第一个项目变为显示,并且通常选中的项目不在视图中(但仍然是选中的项目)。
在 VM 中,我有属性“SelectedSettingIndex”,它在更改时引发 PropertyChanged 事件。即使我在过滤器更改时从 VM 自己手动引发事件 (base.OnPropertyChanged("SelectedSettingIndex");),事件似乎并没有真正引发,因为属性并没有真正改变。在这种情况下,必须有一种方法可以调用 ScrollIntoView 或类似的东西,但我无法找出正确的事件或触发器来这样做。我错过了什么?
编辑
这是对我所关心的问题的描述,希望更好:
1) 我在 VM 中使用 CollectionViewSource 来过滤数据。
2)有一个按钮供用户在过滤器之间切换。
3) 假设 ListView 在任何给定时间都可以显示多达 10 个项目。
4) 用户在列表视图的索引 50 处的过滤视图中选择项目“A”。
5) 然后用户点击按钮关闭过滤。
预期结果:ListView 填充有未过滤的列表,项目“A”保持选中状态,ListView 被“滚动”,因此项目“A”仍然可见。
实际结果:ListView 填充有未过滤的列表,项目“A”保持选中状态,ListView 被“滚动”到顶部并显示前 10 个项目。项目“A”不在视图中。