我的视图模型中有ObservableCollection
,而我的视图中有CollectionViewSource
和ListBox
。
ListBox
绑定到CollectionViewSource
。 CollectionViewSource
绑定到ObservableCollection
,对项目进行排序并将它们分组。我通过IsLiveGroupingRequested
上的IsLiveSortingRequested
和CollectionViewSource
属性启用了实时排序和实时分组,因此,只要基础视图模型对象发生更改,它们就会在ListBox
中重新排序和重新分组。这一切都很好。
问题与选择有关。如果我在ListBox
中选择了一个项目,然后由于视图模型对象以某种方式更改而将其重新分组,则当该项目移至新组时将为un-selected 。
重新组合所选项目时如何保留选择?
这里是显示问题的简单XAML简化示例。如果AllItems中的对象之一的Category属性发生更改,则由于实时成形,该项目将被正确地重新分组。但是,如果选择了该项目,它将变为未选择状态。
<Grid>
<Grid.Resources>
<CollectionViewSource x:Key="MyItems" Source="{Binding AllItems}" IsLiveGroupingRequested="True" IsLiveSortingRequested="True">
<CollectionViewSource.SortDescriptions>
<componentModel:SortDescription PropertyName="Category" />
<componentModel:SortDescription PropertyName="Name" />
</CollectionViewSource.SortDescriptions>
<CollectionViewSource.GroupDescriptions>
<PropertyGroupDescription PropertyName="Category" />
</CollectionViewSource.GroupDescriptions>
</CollectionViewSource>
</Grid.Resources>
<ListBox ItemsSource="{Binding Source={StaticResource MyItems}}">
<ListBox.GroupStyle>
<GroupStyle>
<GroupStyle.HeaderTemplate>
<DataTemplate>
<TextBlock Text="{Binding Name}" />
</DataTemplate>
</GroupStyle.HeaderTemplate>
</GroupStyle>
</ListBox.GroupStyle>
</ListBox>
</Grid>
当前没有简单的解决方案。
我可以看到两种解决方案:
1)手动停止用户实时更新。允许使用跳转数据进行操作很容易出错。
示例:MS的WCF日志查看器中的暂停按钮。
2)在开始更新数据之前,请记住所选项目。更新完成后,只需返回选择即可。
示例:How To Prevent WPF DataGrid From De-Selecting SelectedItem When Items Updated?