带有分组项目的ListView - 通过组头复选框选择所有组成员

Nic*_*sen 7 c# wpf checkbox listview selected

我正在使用C#和WPF,我有一个ListView,它在第一列中保存带有CheckBox的项目.ListView的ItemsSource在代码中设置(不是通过绑定),并包含一个类'Item'的实例,其属性为'Name','Type'和'Selected'.

public class Item : INotifyPropertyChanged
{
    private string _name;
    private bool _selected;
    private string _type;

    public string Name
    {
        get { return _name; }
        set
        {
            _name = value;
            this.OnPropertyChanged();
        }
    }

    public bool Selected
    {
        get { return _selected; }
        set
        {
            _selected = value;
            this.OnPropertyChanged();
        }
    }

    public string Type
    {
        get { return _type; }
        set
        {
            _type = value;
            this.OnPropertyChanged();
        }
    }

    protected virtual void OnPropertyChanged([CallerMemberName] string property = "")
    {
        if (this.PropertyChanged != null) this.PropertyChanged(this, new PropertyChangedEventArgs(property));
    }

    public event PropertyChangedEventHandler PropertyChanged;
}
Run Code Online (Sandbox Code Playgroud)

ListView的视图设置为GridView,第一列是绑定到Selected属性的复选框 - 例如,复选框表示被"选中".

我正在为此ListView添加分组(按'Type'分组),GroupStyle也包含CheckBox.

        var lst = new List<Item>();
        lst.Add(new Item { Name = "A", Type = "1" });
        lst.Add(new Item { Name = "B", Type = "1" });
        lst.Add(new Item { Name = "C", Type = "1" });
        lst.Add(new Item { Name = "A", Type = "2" });
        lst.Add(new Item { Name = "B", Type = "2" });
        lst.Add(new Item { Name = "C", Type = "2" });

        listview.ItemsSource = lst;

        var view = CollectionViewSource.GetDefaultView(lst);
        view.GroupDescriptions.Add(new PropertyGroupDescription("Type"));
Run Code Online (Sandbox Code Playgroud)

ListView的XAML包含GridView和GroupStyle:

    <ListView x:Name="listview">

        <!-- View -->
        <ListView.View>
            <GridView>
                <GridViewColumn Width="50">
                    <GridViewColumn.CellTemplate>
                        <DataTemplate DataType="cls:Item">
                            <CheckBox IsChecked="{Binding Selected, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}" />
                        </DataTemplate>
                    </GridViewColumn.CellTemplate>
                </GridViewColumn>

                <GridViewColumn Width="300" Header="Name" DisplayMemberBinding="{Binding Name, UpdateSourceTrigger=PropertyChanged}"></GridViewColumn>

                <GridViewColumn Width="100" Header="Type" DisplayMemberBinding="{Binding Type}"></GridViewColumn>
            </GridView>
        </ListView.View>

        <!-- Group style -->
        <ListView.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate>
                                    <Expander IsExpanded="True">
                                        <Expander.Header>
                                            <StackPanel Orientation="Horizontal">
                                                <CheckBox></CheckBox>
                                                <TextBlock Text="{Binding Name}" />
                                                <TextBlock Text="{Binding ItemCount, StringFormat='- {0} item(s)'}" />
                                            </StackPanel>
                                        </Expander.Header>
                                        <ItemsPresenter />
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </ListView.GroupStyle>
    </ListView>
Run Code Online (Sandbox Code Playgroud)

最后谈到我的问题:我想要发生的是能够使用组头中的CheckBox 来选择该特定组中的所有项目或不选择任何项目.例如:

例

单击组标题复选框应选择该特定组中的所有项目(如果尚未选中).再次单击它应该取消选择(取消选中)该组中的所有项目.如果用户手动选择或取消选择组中的某些项目,那么组头复选框显示不确定状态会很好,但只是取消选中也会很好.

我不知道从哪里开始.我假设我需要绑定组头复选框的IsChecked属性,但我不知道将它绑定到什么,因为datacontext将是某种不包含有关该组的任何信息的GroupDescriptor事物,也不该组中有哪些项目(右??).

我没有严格遵循MVVM所以我不担心在绑定和我的viewmodel中完成所有操作,我会很好听一些事情,比如听一下复选框的Checked事件,并以某种方式在代码中找出应该检查哪些项目.例如; 如果我可以收听Checked事件并以某种方式提取组的类型我将主要设置(我可以浏览整个列表并选择所有匹配组的组).但我甚至没有看到这样做的方法; 我可以在Checked事件(发件人)中获取CheckBox,并且我可以循环到所有父控件,但我无处可去提取有关我正在分组的属性的信息......

任何帮助都会很棒!

The*_*ing 0

您可以处理何时检查组标题,然后循环遍历组中的项目并将 IsChecked 设置为 true。