如何在具有多个级别的WPF数据网格中显示分组?

时间:2010-05-07 20:03:52

标签: c# wpf

我对WPF比较陌生,所以我对Styles和setter有所了解,但是我遇到了麻烦。

我正在使用WPF数据网格,需要显示多个级别的分组。我希望第二和第三组级别比顶级更加缩进。

以下代码将显示组级别,但它会将它们一个显示在另一个上面,并使它们成为嵌套组级别无法分辨的事实。

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander IsExpanded="True">
                        <Expander.Header>
                            <TextBlock Text="{Binding Path=Name}"/>
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>

<Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}"> <Setter Property="Template"> <Setter.Value> <ControlTemplate TargetType="{x:Type GroupItem}"> <Expander IsExpanded="True"> <Expander.Header> <TextBlock Text="{Binding Path=Name}"/> </Expander.Header> <ItemsPresenter /> </Expander> </ControlTemplate> </Setter.Value> </Setter> </Style>

如何根据级别缩进组标题?

5 个答案:

答案 0 :(得分:3)

如果有未来的人遇到这个问题。我能够嵌套组并设置样式,以便通过执行以下操作将它们堆叠在一起。

将属性添加到CollectionViewSource:

<Window.Resources>
    <CollectionViewSource x:Key="cvs" Source="{Binding TestData}">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="TopProperty"/>
            <PropertyGroupDescription PropertyName="SubProperty"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
</Window.Resources>

然后在DataGrid XAML中,您必须指定2个GroupStyles,第二个将用于嵌套组。我将边距添加到第二组的StackPanel中,将文本推向右侧,使其看起来像是在相应的列中。

<DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <StackPanel>
                                        <Border Background="#FF959595" BorderBrush="#FF727272" BorderThickness="0,0,0,1" Margin="5,0,0,0">                                            
                                            <StackPanel   Height="23" Orientation="Horizontal" Margin="3,0,0,0" Background="#FFE6E6E6">
                                                <TextBlock FontWeight="Bold"  Text="{Binding Path=Name}" Margin="5,0,0,0" Width="100" VerticalAlignment="Center"/>
                                            </StackPanel>
                                        </Border>
                                            <ItemsPresenter />
                                    </StackPanel>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
            <GroupStyle>
                <GroupStyle.HeaderTemplate>
                    <DataTemplate>
                        <StackPanel>
                            <Border Background="#FF959595" BorderBrush="#FF727272" BorderThickness="0,0,0,1" Margin="5,0,0,0">
                                <StackPanel   Height="23" Orientation="Horizontal" Margin="3,0,0,0" Background="#FFF3F3F3">
                                    <TextBlock FontWeight="Bold"  Text="{Binding Path=Name}" Margin="55,0,0,0" Width="100" VerticalAlignment="Center"/>
                                </StackPanel>
                            </Border>
                        </StackPanel>
                    </DataTemplate>
                </GroupStyle.HeaderTemplate>
            </GroupStyle>
</DataGrid.GroupStyle>

我能在这里找到更多信息: https://msdn.microsoft.com/en-us/library/ff407126%28v=vs.110%29.aspx

答案 1 :(得分:2)

我遇到了同样的问题,发现了一个不完美的解决方法。如果在ItemsPresenter的左侧添加边距,则每个级别都会缩减,如您所期望的那样。不幸的是,列标题不再与内容列对齐。我还在寻找解决方案......

答案 2 :(得分:1)

据我所知(或上次我检查过),WPF Datagrid不支持分层分组。

我能找到的最近的是this

这就是我们在应用中使用Xceed DataGrid的原因。不幸的是,它不是免费的,所以可能不适合你。

答案 3 :(得分:1)

本教程朝着正确的方向发展:Multi Grouping in DataGrid 但遗憾的是'PagedCollectionView'是Silverlight。

答案 4 :(得分:0)

我已经使用ICollectionView和PropertyGroupDescription来添加分组,但是,您仍然必须使用XAML来描述分组的显示方式,否则您将无法获得分组的任何UI指示。

我对如何设置XAML感兴趣,以便我可以表示多个级别的分组,最好是每组级别或类似的某种缩进....