具有实时整形/分组的WPF ListBox - 如何在重新组合项目时保持选择?

时间:2013-06-27 23:57:18

标签: c# .net wpf wpf-4.5

我的视图模型中有ObservableCollection,我的视图中有CollectionViewSourceListBox

ListBox绑定到CollectionViewSourceCollectionViewSource绑定到ObservableCollection,对项目进行排序并将其排列成组。我通过IsLiveGroupingRequested上的IsLiveSortingRequestedCollectionViewSource属性启用了实时排序和实时分组,因此每当基础视图模型对象发生更改时,它们都会重新排序并重新分组到ListBox。一切正常。

问题与选择有关。如果我在ListBox中选择了一个项目,然后由于视图模型对象以某种方式被更改而重新分组,则该项目在移动到新组时将被取消选择。

如何重新分组所选项目时如何保留选择?

这是一个简单的修剪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>

我在互联网上寻找解决方案,但根本找不到任何东西。我找到this thread,但没有发布解决方案。

我正拉着我的头发试图让这个工作。我非常感谢任何帮助!

1 个答案:

答案 0 :(得分:2)

目前没有简单的解决方案。

我可以看到两种解决方案:

1)用户手动停止实时更新。    允许使用跳转数据很容易出错。

示例:从MS中暂停WCF日志查看器中的按钮。

2)在开始更新数据之前,请记住所选项目。更新完成后只返回选择。

示例:How To Prevent WPF DataGrid From De-Selecting SelectedItem When Items Updated?