2013-06-19 310 views
16

我想要创建跨越一列中的多行的WPF数据网格。像这样:在WPF DataGrid中合并单元格

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

如何更改以下代码以完成它?

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

有你有使用'DataGrid'一个原因?这看起来很简单,您应该可以更轻松地在ListView中使用自定义ListViewItems。 – Gjeltema

+0

我认为ListView也可以。真实的东西有更多的列,它们会被点击特定单元格的颜色,等等...... –

+0

我不是'ListView'自己的最大粉丝,但是对于您正在寻找的自定义,我认为这将是更好的选择。我发现'DataGrid'(甚至是第三方的'DataGrid'控件)不能轻松地完成像“多行列单元格”这样的操作。 – Gjeltema

回答

8

尝试使用DataGridTemplateColumn。我创建的样本测试类数据绑定

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

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

一个DataGrid和代码隐藏

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

这可以工作,但请注意,一旦使用DataGridTemplateColumn复制/粘贴不再跨行或列工作。 – Kelly

+2

如果属性的数量是动态的,有时是2,有时是4?它如何被渲染? –

0

关于这个问题的另一个有用的文章是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" /> 

注意Grid.ColumnSpanGrid.RowSpan属性。

+7

这似乎是关于布局网格,而不是DataGrid – peterG

3

我设法实现了一个解决方案,可以根据您的需要进行三级分组,只需一个小问题,即组头标随数据滚动。

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

和电网:

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