0

我有一个充满数据的 DataGrid。我想做的是修改特定行的模板以显示该行和新标题。例如:

Header 1 | Header 2 | Header 3
Data   1 | Data   2 | Data   3                               (row 1)
Data   1 | Data   2 | Data   3                               (row 2)
Header 1 | Header 2 | Header 3 | Header 4 | Header 5         (row 3)
Data   1 | Data   2 | Data   3 | Data   4 | Data   5         (row 3)
Data   1 | Data   2 | Data   3                               (row 4)

这是说明我的需求的屏幕截图。

有没有办法做到这一点?谢谢你。

4

2 回答 2

2

我终于找到了一种方法来实现我想要做的事情:

我使用派生自 DataTemplateSelector 的 Selector 设置 DataGrid.ItemTemplateSelector 属性。在此选择器的 SelectTemplate() 方法中,我为普通行返回 null(以应用默认模板),否则我创建并返回与特殊行对应的 DataTemplate(动态地,感谢 XamlReader)。此模板由 DataGrid 组成。DataGrid 的 ItemsSource 属性是使用转换器设置的(行数据转换为对象列表)。

于 2013-07-02T08:09:43.600 回答
1

我设法创建了以下内容:

在此处输入图像描述

如果我理解正确,在这种情况下,您必须使用嵌套的DataGrid. 这个效果可以通过 来实现DataGridTemplateColumn.CellTemplate -> your DataTemplate。此外,模式应该是 "normal" TextBlock,因此它在嵌套DataGrid隐藏时会显示一些值。将使用DataTriggerin进行检查DataTemplate

XAML 代码:

    <DataGrid Name="SimpleDataGrid" AutoGenerateColumns="False" RowHeaderWidth="0" CanUserAddRows="False" CanUserResizeColumns="False" CanUserResizeRows="False" Loaded="SimpleDataGrid_Loaded">
        <DataGrid.Columns>
            <DataGridTemplateColumn Width="1.5*" Header="HeaderWithDataGrid" IsReadOnly="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <!-- Nested DataGrid -->
                            <DataGrid Name="InsertedDataGrid" AutoGenerateColumns="False" RowHeaderWidth="0" Loaded="InsertedDataGrid_Loaded">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="InsertedHeader1" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
                                    <DataGridTextColumn Header="InsertedHeader2" Width="1.5*" Binding="{Binding Age}" IsReadOnly="False" />
                                    <DataGridTextColumn Header="InsertedHeader3" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
                                </DataGrid.Columns>
                            </DataGrid>

                            <!-- Simply value, if nested DataGrid will be Hidden -->
                            <TextBlock Name="SimpleValue" Text="{Binding Age}" Visibility="Hidden" />
                        </Grid>

                        <DataTemplate.Triggers>
                            <!-- It checks for Hidden NestedDataGrid -->
                            <DataTrigger Binding="{Binding ShowInsertedGrid}" Value="Hidden">
                                <Setter TargetName="InsertedDataGrid" Property="Visibility" Value="Collapsed" />
                                <Setter TargetName="SimpleValue" Property="Visibility" Value="Visible" />
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

            <!-- Simply column -->
            <DataGridTextColumn Header="SimpleHeader" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
        </DataGrid.Columns>
    </DataGrid>

Person类列表:

public class Person
{
    public string Name
    {
       get;
       set;
    }

    public int Age
    {
       get;
       set;
    }

    // For clarity using string. 
    // In real project using a bool.
    public string ShowInsertedGrid
    {
       get;
       set;
    }
}

两个ObservableCollection用于 DataGrid 的:

private ObservableCollection<Person> DataForDataGrid = new ObservableCollection<Person>();
private ObservableCollection<Person> DataForInsertedDataGrid = new ObservableCollection<Person>();

Loaded主 DataGrid 的处理程序事件集数据中:

    private void SimpleDataGrid_Loaded(object sender, RoutedEventArgs e)
    {
        DataForDataGrid.Add(new Person()
        {                
            Age = 2,
            Name = "Nick",
            ShowInsertedGrid = "Hidden", // Hidden NestedDataGrid
        });

        DataForDataGrid.Add(new Person()
        {
            Age = 1,
            Name = "Sam",
        });

        DataForDataGrid.Add(new Person()
        {
            Name = "Kate",
            Age = 15,
            ShowInsertedGrid = "Hidden",  // Hidden NestedDataGrid
        });

        SimpleDataGrid.ItemsSource = DataForDataGrid;            
    }

LoadedNestedDataGrid 的事件处理程序:

    private void InsertedDataGrid_Loaded(object sender, RoutedEventArgs e)
    {
        DataGrid MyDataGrid = sender as DataGrid;

        DataForInsertedDataGrid.Add(new Person()
        {
            Name = "Bob",
            Age = 15,
        });

        DataForInsertedDataGrid.Add(new Person()
        {
            Name = "SpanchBob",
            Age = 151,
        });

        MyDataGrid.ItemsSource = DataForInsertedDataGrid;
    }

为了美丽和改善外观,使用Styles.

编辑:

如果您希望您的 NestedDataGrid在整个Row上,那么我可以建议以下解决方案(不是最好的解决方案,但我只能提供这个):

在此处输入图像描述

对于每个单元格都将使用 DataTemplate。因此SimpleHeader转化为:

            <DataGridTemplateColumn Width="1.5*" Header="SimpleHeader" IsReadOnly="False">
                <DataGridTemplateColumn.CellTemplate>
                    <DataTemplate>
                        <Grid>
                            <!-- Nested DataGrid -->
                            <DataGrid Name="InsertedDataGrid2" AutoGenerateColumns="False" RowHeaderWidth="0" Loaded="InsertedDataGrid2_Loaded">
                                <DataGrid.Columns>
                                    <DataGridTextColumn Header="InsertedHeader4" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
                                    <DataGridTextColumn Header="InsertedHeader5" Width="1.5*" Binding="{Binding Age}" IsReadOnly="False" />
                                    <DataGridTextColumn Header="InsertedHeader6" Width="1.5*" Binding="{Binding Name}" IsReadOnly="False" />
                                </DataGrid.Columns>
                            </DataGrid>

                            <!-- Simply value, if nested DataGrid will be Hidden -->
                            <TextBlock Name="SimpleValue" Text="{Binding Name}" Visibility="Hidden" />
                        </Grid>

                        <DataTemplate.Triggers>
                            <!-- It checks for Hidden NestedDataGrid -->
                            <DataTrigger Binding="{Binding ShowInsertedGrid}" Value="Hidden">
                                <Setter TargetName="InsertedDataGrid2" Property="Visibility" Value="Collapsed" />
                                <Setter TargetName="SimpleValue" Property="Visibility" Value="Visible" />
                            </DataTrigger>
                        </DataTemplate.Triggers>
                    </DataTemplate>
                </DataGridTemplateColumn.CellTemplate>
            </DataGridTemplateColumn>

设置InsertedDataGrid2_Loaded数据的位置:

    private void InsertedDataGrid2_Loaded(object sender, RoutedEventArgs e)
    {
        DataGrid MyDataGrid = sender as DataGrid;

        DataForInsertedDataGrid2.Add(new Person()
        {
            Name = "Bob2",
            Age = 215,
        });

        DataForInsertedDataGrid2.Add(new Person()
        {
            Name = "SpanchBob2",
            Age = 251,
        });

        MyDataGrid.ItemsSource = DataForInsertedDataGrid2;
    }

对于使用 的每一列DataGrid,以及为它加载数据的代码。因此,计算 main 和 nested 的总列数DataGrid

于 2013-06-25T16:21:43.900 回答