Merge Cells in WPF DataGrid

后端 未结 3 1569
无人共我
无人共我 2020-12-01 16:38

I want to create a WPF datagrid that spans over multiple rows in one column. Like this:

+-------+----------------+
| Name  | Attributes     |
+-------+------         


        
相关标签:
3条回答
  • 2020-12-01 16:48

    I managed to implement a solution that does what you want with three levels of grouping with one small issue, in that that the Group Headers scroll horiztonaly with the data.

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

    And the Grid:

                <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>
    
    0 讨论(0)
  • 2020-12-01 16:57

    Try use DataGridTemplateColumn. I created sample test class for databinding

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

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

    And fill it in code-behind

    List<Test> list = new List<Test>();
    //populate list with your data here
    dataGrid1.DataContext = list;
    
    0 讨论(0)
  • 2020-12-01 17:05

    Another helpful article on the subject is 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" />
    

    Notice the Grid.ColumnSpan and Grid.RowSpan attributes.

    0 讨论(0)
提交回复
热议问题