2017-03-20 2 views
0

Je souhaite regrouper mes données avec un expanseur contenant le nom du groupe et contenant tous les noms ClassMate.Regroupement des données sur Datagrid wpf

Ceci est mon groupe de classe:

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

Ma classe Classmate:

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

J'ai essayé de le faire avec ce Xaml mais je ne sais pas pourquoi cela ne fonctionne pas

<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> 

Qu'est-ce que je fais mal? Merci

+0

nom de la propriété de texte groupe devrait être 'name' –

Répondre

1

Vous devez lier la propriété ItemsSource à une collection source groupée. La meilleure façon de le faire est d'utiliser un 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> 
+0

Super! C'est vraiment ce dont j'ai besoin. Une seule question, si je veux créer une grille avec tous les élèves, comment puis-je faire l'en-tête de la grille? Thx –

+1

Veuillez poser une nouvelle question si vous avez un autre problème. Assurez-vous d'inclure une description détaillée du problème ainsi que des extraits de code pertinents pour que quelqu'un d'autre puisse le reproduire. – mm8

0

XAML design

<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; 
    } 
+1

Ma structure, comme vous pouvez le voir jusqu'à, est différent! –