You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

WPF如何通过CheckBox实现DataGrid分组功能的动态开启与关闭?

实现方法

可以实现,这里给你两种可行的实现方式,你可以根据项目需求选择:

方式一:后台事件实现(推荐,逻辑简单易维护)

只需要给CheckBox加选中/取消选中事件,动态修改CollectionViewSource的分组描述集合即可,原有其他代码完全不用动:

  1. 修改CheckBox代码,添加事件声明:
<CheckBox x:Name="chkGroupSwitch" IsChecked="True" Checked="chkGroupSwitch_OnChecked" Unchecked="chkGroupSwitch_OnUnchecked">Enable Grouping</CheckBox>
  1. 在对应窗口的后台.cs文件中添加事件处理逻辑:
private void chkGroupSwitch_OnChecked(object sender, RoutedEventArgs e)
{
    var s3ListSource = (CollectionViewSource)grpRemote.FindResource("S3List");
    if (s3ListSource.GroupDescriptions.Count == 0)
    {
        s3ListSource.GroupDescriptions.Add(new PropertyGroupDescription("CustomerName"));
    }
}

private void chkGroupSwitch_OnUnchecked(object sender, RoutedEventArgs e)
{
    var s3ListSource = (CollectionViewSource)grpRemote.FindResource("S3List");
    s3ListSource.GroupDescriptions.Clear();
}

这个方式运行稳定、性能好,普通业务场景优先用这个。

方式二:纯XAML实现(无后台代码)

如果你不想写后台逻辑,可以直接把分组头的可见性绑定到CheckBox的勾选状态,同时隐藏分组的缩进效果:
修改DataGrid的GroupStyle部分代码如下:

<DataGrid.GroupStyle>
    <GroupStyle>
        <GroupStyle.Panel>
            <ItemsPanelTemplate>
                <DataGridRowsPresenter/>
            </ItemsPanelTemplate>
        </GroupStyle.Panel>
        <GroupStyle.HeaderTemplate>
            <DataTemplate>
                <Label Content="{Binding Name}" 
                       Visibility="{Binding ElementName=chkGroupSwitch, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>
            </DataTemplate>
        </GroupStyle.HeaderTemplate>
        <GroupStyle.ContainerStyle>
            <Style TargetType="{x:Type GroupItem}">
                <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type GroupItem}">
                        <StackPanel>
                            <ContentPresenter Visibility="{Binding ElementName=chkGroupSwitch, Path=IsChecked, Converter={StaticResource BooleanToVisibilityConverter}}"/>
                            <ItemsPresenter />
                        </StackPanel>
                    </ControlTemplate>
                </Setter.Value>
                </Setter>
            </Style>
        </GroupStyle.ContainerStyle>
    </GroupStyle>
</DataGrid.GroupStyle>

注意这个方式本质是保留了分组逻辑,只是隐藏了分组相关的UI元素,适合不需要完全取消分组逻辑、仅隐藏UI的场景。

内容的提问来源于stack exchange,提问作者AndyD273

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.09.27 17:36:02