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

时间:2011-09-06 02:06:25

标签: c# wpf listview checkbox grouping

我有一个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>

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

1 个答案:

答案 0 :(得分:1)

可悲的是,它并不像它需要的那样简单,

请注意,群组标题CheckBoxDataContext,这是一种称为GroupItem的特殊对象。在此GroupItem中,存在Name属性,该属性是该组所代表的值,即基于哪个分组发生的公共值。

很多人将此与群组描述属性混淆,例如假设您在GroupDescription个员工中添加了EmployeeStatus个属性CollectionView,那么GroupItem.Name不是EmployeeStatus,但它实际上是哪个组的值已创建,例如PresentAbsentOnLeave等。

有了这些知识,我们就试着去实现你想要的......

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

    <CheckBox x:Name="HeaderCheckBox" ...>
    
  2. 我们在ListView级别处理Button.Click(一个冒泡的附加事件)。

    <ListView Button.Click="HandleCheckBoxClick" ...>
    
  3. 在处理程序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.
            }
        }
    } 
    
  4. 可悲的是,这是实现目标的唯一途径。如果您使用的是MVVM,则必须通过附加行为完成整个代码。

    如果有帮助,请告诉我。