Datagrid wpf集团与exapander

时间:2017-03-27 08:13:53

标签: c# wpf xaml datagrid

我会按属性GroupName对数据进行分组。 我想在该类的所有人中都有一个包含GroupName的扩展器。 它都在datagrid wpf列表中。

这是我的Person课程:

public class Person : INotifyPropertyChanged
{
    public string GroupName { get; set; }

    public string Name { get; set; }
    public string DisplayName { get; set; }
}

这是我的(不工作)XML:

<Grid>
        <Grid.Resources>
            <CollectionViewSource x:Key="groups" Source="{Binding Group}">
                <CollectionViewSource.GroupDescriptions>
                    <PropertyGroupDescription PropertyName="GroupName" />
                </CollectionViewSource.GroupDescriptions>
            </CollectionViewSource>
        </Grid.Resources>
        <DataGrid x:Name="gridMates" ItemsSource="{Binding Source={StaticResource groups}}" AutoGenerateColumns="False" HorizontalAlignment="Stretch">

            <DataGrid.Resources>
                <local:BindingProxy x:Key="proxy" Data="{Binding}" />
            </DataGrid.Resources>
            <DataGrid.RowStyle>
                <Style TargetType="{x:Type DataGridRow}">
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding IsVisible}" Value="False">
                            <Setter Property="Visibility" Value="Collapsed"/>
                        </DataTrigger>
                    </Style.Triggers>
                    <Setter Property="IsSelected" Value="{Binding Path=Selected, Mode=TwoWay}" />
                </Style>
            </DataGrid.RowStyle>

            <DataGrid.GroupStyle>
                <GroupStyle>
                    <GroupStyle.ContainerStyle>
                        <Style TargetType="{x:Type GroupItem}">
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type GroupItem}">
                                        <Expander IsExpanded="True" >
                                            <Expander.Header>
                                                <DockPanel>
                                                    <TextBlock Text="{Binding Path=Name}" />
                                                </DockPanel>
                                            </Expander.Header>
                                            <Expander.Content>
                                                <ItemsControl >
                                                    <ItemsControl.ItemTemplate>
                                                        <DataTemplate>

                                                            <StackPanel>
                                                                <TextBlock  Grid.Column="0" Text="{Binding Path=DisplayName}" Style="{StaticResource cellStyle}" />
                                                                <TextBlock  Grid.Column="1" Text="{Binding Path=Name}" Style="{StaticResource cellStyle}" />
                                                          </StackPanel>

                                                        </DataTemplate>
                                                    </ItemsControl.ItemTemplate>
                                                </ItemsControl>
                                            </Expander.Content>
                                        </Expander>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>
                    </GroupStyle.ContainerStyle>
                </GroupStyle>
            </DataGrid.GroupStyle>
        </DataGrid>
    </Grid>

1 个答案:

答案 0 :(得分:0)

您应该将CollectionViewSource绑定到IEnumerable<Person>,并将Expander的Content属性设置为<ItemsPresenter />

<Grid>
    <Grid.Resources>
        <CollectionViewSource x:Key="persons" Source="{Binding Persons}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="GroupName" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Grid.Resources>
    <DataGrid x:Name="gridMates" ItemsSource="{Binding Source={StaticResource persons}}" AutoGenerateColumns="False">
        <DataGrid.Columns>
            <DataGridTextColumn Binding="{Binding Name}" Header="Name" />
            <DataGridTextColumn Binding="{Binding DisplayName}" Header="DisplayName" />
        </DataGrid.Columns>
        <DataGrid.GroupStyle>
            <GroupStyle>
                <GroupStyle.ContainerStyle>
                    <Style TargetType="{x:Type GroupItem}">
                        <Setter Property="Template">
                            <Setter.Value>
                                <ControlTemplate TargetType="{x:Type GroupItem}">
                                    <Expander IsExpanded="True" >
                                        <Expander.Header>
                                            <DockPanel>
                                                <TextBlock Text="{Binding Path=Name}" />
                                            </DockPanel>
                                        </Expander.Header>
                                        <Expander.Content>
                                            <ItemsPresenter />
                                        </Expander.Content>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
    </DataGrid>
</Grid>