C # WPF Toolkit DataGrid - группа внутри группы? - PullRequest
1 голос
/ 11 марта 2011

У меня есть группа, в которой есть предметы, и я бы хотел, чтобы в этой группе была подгруппа.

Основные группы : подгруппы "Windows", "Linux", "Mac" и : "Данные", "Basic", "Advanced"

Подгруппы будут содержать элементы строк. Кроме того, для каждой основной группы могут быть разные подгруппы.

Как я могу это сделать?

Вот мой код:

<Window.Resources>
    <CollectionViewSource x:Key="OSGroups">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="os"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>

    <Style x:Key="GroupContainerStyle" TargetType="{x:Type GroupItem}">
        <Style.Resources>
            <LinearGradientBrush x:Key="OutBrush" StartPoint="0,0" EndPoint="0,1">
                <GradientStop Offset="0" Color="#FEB74B"/>
                <GradientStop Offset="1" Color="#F19201"/>
            </LinearGradientBrush>
        </Style.Resources>
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander IsExpanded="True" Background="{StaticResource OutBrush}" BorderThickness="0">
                        <Expander.Header>
                            <Grid>
                                <Grid.ColumnDefinitions>
                                    <ColumnDefinition Width="Auto"/>
                                </Grid.ColumnDefinitions>

                                <StackPanel Grid.Column="0" Orientation="Horizontal" Margin="0,0,10,0">
                                    <TextBlock Text="{Binding Path=Name}"/>
                                </StackPanel>
                            </Grid>
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <wpfToolkit:DataGrid Name="CommandsDataGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding Source={StaticResource OSGroups}}" CellStyle="{StaticResource CellStyle}" HeadersVisibility="Column" Height="250" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
        <wpfToolkit:DataGrid.GroupStyle>
            <GroupStyle ContainerStyle="{StaticResource GroupContainerStyle}">
                <GroupStyle.Panel>
                    <ItemsPanelTemplate>
                        <wpfToolkit:DataGridRowsPresenter/>
                    </ItemsPanelTemplate>
                </GroupStyle.Panel>
            </GroupStyle>
        </wpfToolkit:DataGrid.GroupStyle>
        <wpfToolkit:DataGrid.Columns>
            <wpfToolkit:DataGridTextColumn Header="Command" Binding="{Binding Path=command}" />
            <wpfToolkit:DataGridTextColumn Header="Description" Width="*" Binding="{Binding Path=description}" />
        </wpfToolkit:DataGrid.Columns>
    </wpfToolkit:DataGrid>
</Grid>

Ответы [ 2 ]

1 голос
/ 21 мая 2011

Обратите внимание, отступ работает только с одной подгруппой, поскольку у нас есть только IsBottomLevel, а не Level.

    <CollectionViewSource x:Key="OSGroups">
        <CollectionViewSource.GroupDescriptions>
            <PropertyGroupDescription PropertyName="os"/>
            <PropertyGroupDescription PropertyName="subGroup"/>
        </CollectionViewSource.GroupDescriptions>
    </CollectionViewSource>
    <Style x:Key="GroupHeaderStyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander IsExpanded="True">
                        <Expander.Style>
                            <Style TargetType="{x:Type Expander}">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding IsBottomLevel}" Value="True">
                                        <Setter Property="Margin" Value="20,0,0,0" />
                                    </DataTrigger>

                                </Style.Triggers>
                            </Style>
                        </Expander.Style>
                        <Expander.Header>
                            <TextBlock Text="{Binding Name}"/>
                        </Expander.Header>
                        <ItemsPresenter Margin="-10,0,0,0" />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
0 голосов
/ 04 апреля 2013

Вы можете определить любое количество стилей внутри элемента DataGrid.GroupStyle. Рассмотрим ниже xaml, здесь я определил два стиля контейнера группы, а именно GroupContainerStyle и SecondGroupContainerStyle. Теперь для основной группы (1-й уровень) будет применяться GroupConstainerStyle, а для ваших подгрупп (2-й уровень) SecondGroupContainerStyle будет применяться автоматически.

В SecondGroupContainerStyle вы можете изменить отступ, например, как сделал spasrto.

<wpfToolkit:DataGrid Name="CommandsDataGrid" AutoGenerateColumns="False" IsReadOnly="True" CanUserAddRows="False" CanUserDeleteRows="False" CanUserResizeRows="False" CanUserSortColumns="False" ItemsSource="{Binding Source={StaticResource OSGroups}}" CellStyle="{StaticResource CellStyle}" HeadersVisibility="Column" Height="250" HorizontalAlignment="Stretch" VerticalAlignment="Stretch">
    <wpfToolkit:DataGrid.GroupStyle>
        <GroupStyle ContainerStyle="{StaticResource GroupContainerStyle}">
            <GroupStyle.Panel>
                <ItemsPanelTemplate>
                    <wpfToolkit:DataGridRowsPresenter/>
                </ItemsPanelTemplate>
            </GroupStyle.Panel>
        </GroupStyle>

        <GroupStyle ContainerStyle="{StaticResource SecondGroupContainerStyle}">
            <GroupStyle.Panel>
                <ItemsPanelTemplate>
                    <wpfToolkit:DataGridRowsPresenter/>
                </ItemsPanelTemplate>
            </GroupStyle.Panel>
        </GroupStyle>           
    </wpfToolkit:DataGrid.GroupStyle>

</wpfToolkit:DataGrid>
...