在Datagrid上分组数据wpf

时间:2017-03-20 08:00:29

标签: c# wpf datagrid grouping wpfdatagrid

我想使用包含组名的扩展器重新组合我的数据,并在其中包含所有ClassMate名称。

这是我的班组:

public class Group{ 
public List<ClassMate> CLGroup { get; set; }
public string GroupName { get; set; }}

我的classMate类:

public class ClassMate: INotifyPropertyChanged{
public string Name { get; set; }
public string DisplayName { get; set; }}

我试图用这个Xaml做到这一点,但我不知道它为什么不起作用

<DataGrid x:Name="gridMates"  ItemsSource="{Binding Groups }"  >
    <DataGrid.GroupStyle>
        <!-- Style for groups at top level. -->
        <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=GroupName}" />
                                    </DockPanel>
                                    </Expander.Header>
                                    <Expander.Content>
                                        <ItemsControl ItemsSource="{Binding Path=CLGroup}">
                                            <ItemsControl.ItemTemplate>
                                                <DataTemplate>
                                                    <StackPanel>
                                                        <TextBlock   Text="{Binding Path=DisplayName}"/>

                                                    </StackPanel>

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

    </DataGrid.GroupStyle>

我做错了什么? 感谢

2 个答案:

答案 0 :(得分:2)

您需要将ItemsSource属性绑定到分组的源集合。最简单的方法是使用CollectionViewSource

<Grid>
    <Grid.Resources>
        <CollectionViewSource x:Key="groups" Source="{Binding Groups}">
            <CollectionViewSource.GroupDescriptions>
                <PropertyGroupDescription PropertyName="GroupName" />
            </CollectionViewSource.GroupDescriptions>
        </CollectionViewSource>
    </Grid.Resources>
    <DataGrid x:Name="gridMates" ItemsSource="{Binding Source={StaticResource groups}}" AutoGenerateColumns="False">
        <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 ItemsSource="{Binding Path=Items[0].CLGroup}">
                                                <ItemsControl.ItemTemplate>
                                                    <DataTemplate>
                                                        <StackPanel>
                                                            <TextBlock Text="{Binding Path=DisplayName}"/>
                                                        </StackPanel>
                                                    </DataTemplate>
                                                </ItemsControl.ItemTemplate>
                                            </ItemsControl>
                                        </Expander.Content>
                                    </Expander>
                                </ControlTemplate>
                            </Setter.Value>
                        </Setter>
                    </Style>
                </GroupStyle.ContainerStyle>
            </GroupStyle>
        </DataGrid.GroupStyle>
    </DataGrid>
</Grid>

答案 1 :(得分:0)

XAML设计

<Window.Resources>
    <Style x:Key="groupheaderstyle" TargetType="{x:Type GroupItem}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type GroupItem}">
                    <Expander x:Name="exp" IsExpanded="True" Background="White" Foreground="Black">
                        <Expander.Header>
                            <TextBlock Text="{Binding Gropname}" />
                        </Expander.Header>
                        <ItemsPresenter />
                    </Expander>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<DataGrid x:Name="dgdata" HorizontalAlignment="Left" Height="269" VerticalAlignment="Top" Width="292">
    <DataGrid.GroupStyle>
        <GroupStyle ContainerStyle="{StaticResource groupheaderstyle}">
            <GroupStyle.Panel>
                <ItemsPanelTemplate>
                    <DataGridRowsPresenter />
                </ItemsPanelTemplate>
            </GroupStyle.Panel>
        </GroupStyle>
    </DataGrid.GroupStyle>
</DataGrid>

XAML Design.CS

public class group
    {
        public string groupname { get; set; }
        public string CLgroup { get; set; }
        public string displayname { get; set; }
    }
    public Window4()
    {
        InitializeComponent();
        ObservableCollection<group> samdata = new ObservableCollection<group>
        {
            new group{groupname="Group1",CLgroup="xxx",displayname="demo1"},
            new group{groupname="Group1",CLgroup="yyy",displayname="demo2"},
            new group{groupname="Group1",CLgroup="yyy",displayname="demo2"},
            new group{groupname="Group2",CLgroup="yyy",displayname="demo2"},
            new group{groupname="Group2",CLgroup="yyy",displayname="demo2"},
            new group{groupname="Group2",CLgroup="yyy",displayname="demo2"},
            new group{groupname="Group3",CLgroup="zzz",displayname="demo3"},
            new group{groupname="Group3",CLgroup="yyy",displayname="demo2"},
            new group{groupname="Group3",CLgroup="yyy",displayname="demo2"},
        };          
        ListCollectionView collection = new ListCollectionView(samdata);
        collection.GroupDescriptions.Add(new PropertyGroupDescription("groupname"));
        dgdata.ItemsSource = collection;
    }