2017-03-20 36 views
0

グループ名を含むエキスパンダーでデータを再編成し、その中にすべてのClassMate名が含まれているようにしたい。Datagrid wpfでデータをグループ化する

これは私のクラスのグループである:

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

同級生クラス:

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> 
を働いていない理由を私は知りません

私は間違っていますか? おかげ

+0

グループのテキストのプロパティ名は、 'NAME' –

答えて

1

あなたがグループ化されたソースコレクションに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> 
+0

素晴らしい!それは本当に私が必要なものです。 1つの質問のみ、すべての生徒と一緒にグリッドを作成したい場合は、どうすればグリッドのヘッダーを作成できますか? Thx –

+1

別の問題がある場合は、新しい質問をしてください。問題の詳細な説明と他の誰かがそれを再現できるように関連するコードスニペットを含めてください。 – mm8

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

マイ構造である必要があり、違います! –

関連する問題