C# 标题中带有复选框的分组ListView

C# 标题中带有复选框的分组ListView,c#,wpf,listview,checkbox,grouping,C#,Wpf,Listview,Checkbox,Grouping,我有一个绑定到一些数据的ListView,它被分组和排序。我在分组标题中添加了一个复选框,如下所示: <ListView.GroupStyle> <GroupStyle> <GroupStyle.ContainerStyle> <Style TargetType="{x:Type GroupItem}">

我有一个绑定到一些数据的ListView,它被分组和排序。我在分组标题中添加了一个复选框,如下所示:

            <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Margin" Value="0,0,0,5"/>
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True" BorderBrush="#FFA4B97F" BorderThickness="0,0,0,1">
                                        <Expander.Header>
                                            <DockPanel>
                                                <CheckBox>
                                                    <StackPanel Orientation="Horizontal">
                                                        <TextBlock FontWeight="Bold" Text="{Binding Path=Name}" Margin="5,0,0,0"/>
                                                        <TextBlock Text=" ("/>
                                                        <TextBlock Text="{Binding Path=ItemCount}"/>
                                                        <TextBlock Text=" Items)"/>
                                                    </StackPanel>
                                                </CheckBox>
                                            </DockPanel>
                                        </Expander.Header>
                                        <Expander.Content>
                                            <ItemsPresenter />
                                        </Expander.Content>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>


现在,我只关心并需要一种方法来循环检查已检查标题的分组项目,实现这一点的最佳方法是什么?

遗憾的是,这并不像需要的那样简单

请记住,组的标题
复选框
有一个
数据上下文
,这是一种称为
GroupItem
的特殊对象。在此
GroupItem
中有
Name
属性,该属性是组表示的值,即分组所基于的公共值

许多人将此与组描述属性混淆,例如,假设您在员工的
集合视图中添加了带有属性
EmployeeStatus
GroupDescription
,然后,
GroupItem.Name
不是
EmployeeStatus
,而是创建组时所依据的值,例如
Present
缺席
OnLeave

有了这些知识,让我们试着去实现你所追求的

  • 我们将标题复选框命名为“HeaderCheckBox”

  • 在处理程序
    HandleButtonClick
    中,我们执行以下代码

    private void HandleCheckBoxClick(object sender, RoutedEventArgs e)
    {
        var checkBox = e.OriginalSource as CheckBox;
        if (checkBox != null && checkBox.Name == "HeaderCheckBox")
        {
            var groupItem = checkBox.DataContext as GroupItem;
    
            //// Assuming MyItem is the item level class and MyGroupedProperty 
            //// is the grouped property that you have added to the grouped
            //// description in your CollectionView.
            foreach (MyItem item in groupItem.Items)
            {
                 //// Place your code for the items under that particular group.
            }
        }
    } 
    
  • 可悲的是,这是实现你所追求的目标的唯一途径。如果您使用的是MVVM,那么整个代码都必须通过附加的行为来完成


    如果有帮助,请告诉我。

    是的,谢谢,我可以将其转化为有效的解决方案。然而,我实际上只是在寻找一种方法,在填充列表后,通过选中标题复选框来获取组列表。然而,使用您的代码,我可以将一个带有复选框的不可见列作为正在显示的类的成员,并根据已选中的组控制复选框,然后很容易找到哪些项已选中,哪些项未选中。再次感谢你!您可以获取所有组,我认为
    列表视图
    公开
    项目
    属性。。。我想应该有单独的小组。。。。这是一个新手的猜测,它可能不会让你赢得德比在.NET 4中,它不是GroupItem,而是CollectionViewGroup
    <ListView Button.Click="HandleCheckBoxClick" ...>
    
    private void HandleCheckBoxClick(object sender, RoutedEventArgs e)
    {
        var checkBox = e.OriginalSource as CheckBox;
        if (checkBox != null && checkBox.Name == "HeaderCheckBox")
        {
            var groupItem = checkBox.DataContext as GroupItem;
    
            //// Assuming MyItem is the item level class and MyGroupedProperty 
            //// is the grouped property that you have added to the grouped
            //// description in your CollectionView.
            foreach (MyItem item in groupItem.Items)
            {
                 //// Place your code for the items under that particular group.
            }
        }
    }