我有一个ListView中的视图中显示的虚拟机中的ObservableCollection。当选定的项目更改时,SelectionChanged事件触发很好。下面是我如何配置ListView:如何在MVVM(WPF)应用程序中更改ListView上的筛选器后使用ScrollIntoView?
<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从第一个项目更改为显示,并且通常所选项目不在视图中(但仍为选定项目)。
在虚拟机,我的财产“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”不在视野中。
我几乎已经doin g你在第一篇文章中提出的建议,除了使用SelectedIndex而不是SelectedItem,并且我没有在我的虚拟机中引用ListView。无论哪种方式我的结果是相同的 - 改变过滤器重置视图“滚动”到开始。 对于第二个建议 - 我使用CollectionView(在VM中)进行过滤。我找不到适当的事件来回应,或者如何回应。你能提供更多细节吗? – 2012-04-13 17:29:10
糟糕 - 我说的不完全正确 - 我使用ListCollectionView来进行排序。不确定是否会有所作为... – 2012-04-13 17:36:17
@KJ在应用滤波器之前,将SelectedItem保持为临时变量并在之后再次设置。为了在你的ListView中生效,你必须使用OnPropertyChanged(“SelectedItem”)来使用nofity UI进行手动属性更改。考虑到你以前的SelectedItem不再在你的视图中,因为过滤器。在这种情况下,做CollectionView.MoveCurrentToFirst()。 – Dummy01 2012-04-14 05:49:10