2013-06-19 13 views
16

Ich möchte ein WPF-Datagrid erstellen, das sich über mehrere Zeilen in einer Spalte erstreckt. Wie folgt aus:Zellen in WPF DataGrid verschmelzen

+-------+----------------+ 
| Name | Attributes  | 
+-------+----------------+ 
|  | Horse Power | 
| BMW +----------------+ 
|  | Color   | 
+-------+----------------+ 
|  | Weight   | 
| Ford +----------------+ 
|  | Color   | 
+-------+----------------+ 

Wie kann der folgende Code geändert werden, es zu tun zu bekommen?

<DataGrid AutoGenerateColumns="False"> 
    <DataGrid.Columns> 
      <DataGridTextColumn Header="Name" /> 
      <DataGridTextColumn Header="Attributes" /> 
    </DataGrid.Columns> 
</DataGrid> 
+0

Gibt es einen Grund, warum Sie dies einen 'DataGrid' für verwenden? Das sieht einfach genug aus, dass Sie es einfacher in einer 'ListView' mit angepassten ListViewItems machen können. – Gjeltema

+0

Ich denke, ein ListView würde auch funktionieren. Die echte Sache hat mehr Spalten, sie werden auf Klicken der spezifischen Zellen und so weiter gefärbt ... –

+0

Ich bin nicht der größte Fan der 'ListView' selbst, aber für die Anpassungen, die Sie suchen, denke ich es wäre die beste Wahl. Ich habe festgestellt, dass das 'DataGrid' (sogar' DataGrid'-Steuerelemente von Drittanbietern) nicht so einfach in der Lage sind, Dinge wie "mehrreihige Spaltenzellen" auszuführen. – Gjeltema

Antwort

8

Verwenden Sie DataGridTemplateColumn. Ich habe Probe Testklasse

public class Test 
{ 

    public Test(string name, string attribute1, string attribute2) 
    { 
     Name = name; 
     Attributes = new Attribute(attribute1, attribute2); 
    } 

    public string Name { get; set; } 
    public Attribute Attributes { get; set; } 
} 

public class Attribute 
{ 

    public Attribute(string attribute1, string attribute2) 
    { 
     Attribute1 = attribute1; 
     Attribute2 = attribute2; 
    } 

    public string Attribute1 { get; set; } 
    public string Attribute2 { get; set; } 
} 

für Datenbindung und ein Datagrid in XAML

<DataGrid AutoGenerateColumns="False" Name="dataGrid1" ItemsSource="{Binding}"> 
     <DataGrid.Columns> 
      <DataGridTemplateColumn Header="Name" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate> 
         <Grid> 
          <TextBlock Text="{Binding Path=Name}" VerticalAlignment="Center" Margin="3,3,3,3"/> 
         </Grid> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
      <DataGridTemplateColumn Header="Attributes" > 
       <DataGridTemplateColumn.CellTemplate> 
        <DataTemplate > 
         <Grid> 
          <Grid.RowDefinitions> 
           <RowDefinition Height="50*"/> 
           <RowDefinition /> 
           <RowDefinition Height="50*"/> 
          </Grid.RowDefinitions> 
          <TextBlock Grid.Row="0" Text="{Binding Path=Attributes.Attribute1}" VerticalAlignment="Center" Margin="3,3,3,3"/> 
          <Line Grid.Row="1" Stroke="Black" Stretch="Fill" X2="1" VerticalAlignment="Center"/> 
          <TextBlock Grid.Row="2" Text="{Binding Path=Attributes.Attribute2}" VerticalAlignment="Center" Margin="3,3,3,3"/> 
         </Grid> 
        </DataTemplate> 
       </DataGridTemplateColumn.CellTemplate> 
      </DataGridTemplateColumn> 
     </DataGrid.Columns> 
    </DataGrid> 

und füllen Sie es in Code-behind

List<Test> list = new List<Test>(); 
//populate list with your data here 
dataGrid1.DataContext = list; 
+0

Dies funktioniert, aber beachten Sie, dass wenn Sie DataGridTemplateColumn Copy/Paste verwenden nicht mehr funktioniert über mehrere Zeilen oder Spalten. – Kelly

+2

Was passiert, wenn die Anzahl der Attribute dynamisch ist, manchmal 2, manchmal 4? Wie kann es gerendert werden? –

0

Ein weiterer hilfreicher Artikel über das Thema ist http://www.mindstick.com/Articles/90371ed3-c0f7-49eb-ba2d-9d1f2c9b14e2/?Grid%20Control%20in%20WPF:

<Grid> 
    <Grid.RowDefinitions> 
     <RowDefinition /> 
     <RowDefinition /> 
     <RowDefinition /> 
    </Grid.RowDefinitions> 
    <Grid.ColumnDefinitions> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
     <ColumnDefinition /> 
    </Grid.ColumnDefinitions> 
    <Button x:Name="btn1" Content="First Button" Grid.Row="0" Grid.Column="0" Grid.ColumnSpan="2" /> 
    <Button x:Name="btn2" Content="Second Button" Grid.Row="0" Grid.Column="2" /> 
    <Button x:Name="btn3" Content="Thired Button" Grid.Row="1" Grid.Column="0" Grid.RowSpan="2" /> 
    <Button x:Name="btn4" Content="Fourth Button" Grid.Row="1" Grid.Column="1" /> 
    <Button x:Name="btn5" Content="Fifth Button" Grid.Row="1" Grid.Column="2" /> 
    <Button x:Name="btn6" Content="Six Button" Grid.Row="2" Grid.Column="1" Grid.ColumnSpan="2" /> 

Beachten Sie die Attribute Grid.ColumnSpan und Grid.RowSpan.

+7

Dies scheint sich um das Layout-Raster zu handeln, nicht um das DataGrid – peterG

3

Ich habe es geschafft, eine Lösung zu implementieren, die das mit drei Ebenen der Gruppierung mit einem kleinen Problem macht, dass die Gruppenüberschriften horizontal mit den Daten scrollen.

<Style x:Key="GroupItemStyle" TargetType="{x:Type GroupItem}"> 
     <Setter Property="Template"> 
      <Setter.Value> 
       <ControlTemplate TargetType="{x:Type GroupItem}"> 
         <StackPanel Orientation="Horizontal" > 
          <Border BorderThickness="0"> 
           <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> 
            <Grid.ColumnDefinitions> 
             <ColumnDefinition Width="Auto"/> 
             <ColumnDefinition Width="Auto"/> 
            </Grid.ColumnDefinitions> 

            <Border BorderThickness="1" MinWidth="150"> 
             <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> 
              <ContentPresenter Content="{Binding Name}" > 
              </ContentPresenter> 
             </Grid> 

            </Border> 
            <Border BorderThickness="0" Grid.Column="1"> 
             <Grid HorizontalAlignment="Center" VerticalAlignment="Center"> 
              <ItemsPresenter/> 
             </Grid> 
            </Border> 
           </Grid> 
          </Border> 
         </StackPanel> 
       </ControlTemplate> 
      </Setter.Value> 
     </Setter> 
    </Style> 

und das Gitter:

  <DataGrid ItemsSource="{Binding GroupedData}" AutoGenerateColumns="False" MinRowHeight="25" CanUserAddRows="False" CanUserDeleteRows="False"> 
       <DataGrid.GroupStyle> 
        <!-- First Group --> 
        <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
         <GroupStyle.Panel> 
          <ItemsPanelTemplate> 
           <DataGridRowsPresenter/> 
          </ItemsPanelTemplate> 
         </GroupStyle.Panel> 
        </GroupStyle> 

        <!-- Second Group --> 
        <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
         <GroupStyle.Panel> 
          <ItemsPanelTemplate> 
           <DataGridRowsPresenter/> 
          </ItemsPanelTemplate> 
         </GroupStyle.Panel> 

        </GroupStyle> 

        <!-- Third Group --> 
        <GroupStyle ContainerStyle="{StaticResource GroupItemStyle}"> 
         <GroupStyle.Panel> 
          <ItemsPanelTemplate> 
           <DataGridRowsPresenter/> 
          </ItemsPanelTemplate> 
         </GroupStyle.Panel> 
        </GroupStyle> 
       </DataGrid.GroupStyle> 
       <DataGrid.Columns> 
     ... 
       </DataGrid.Columns> 
      </DataGrid>