我试图通过DataTable
绑定在WPF DataGrid
中显示三维数据.由于DataGrid
只有行和列(2D),我的 idea 是模板单元格,使它们承载ListView
(或其他控件),并显示垂直堆叠的第三维值.
期望的结果是:
下面是一个非常简化但可复制的模拟数据代码,我try 创建这样一个DataTable
:
public partial class MainWindow : Window
{
public MainWindow()
{
InitializeComponent();
ViewModel vm = new();
MyDataGrid.DataContext = vm.Table.DefaultView;
MyDataGrid.IsReadOnly = true;
}
public class ViewModel
{
public DataTable Table { get; init; }
public ViewModel()
{
Table = new DataTable();
Table.Columns.Add(" ");
Table.Columns.Add("c1");
Table.Columns.Add("c2");
Table.Columns.Add("c3");
for (int i = 1; i <= 3; i++ )
{
DataRow row = Table.NewRow();
row[0] = new List<object>() { "r" + i } ;
row[1] = new List<object>() { 10 * i, 20 * i, 25 * i } ;
row[2] = new List<object>() { 12 * i, 26 * i, 30 * i } ;
row[3] = new List<object>() { 16 * i, 28 * i, 36 * i };
Table.Rows.Add(row);
}
}
}
}
如您所见,我将List赋给每个单元格,这样可以创建第三个维度,将多个值存储在一个单元格中.
问题是,我不知道如何在WPF标记中模板化DataGrid,以便正确地解压缩并显示第三个维度,就像上面所示的图像一样.我试过这个:
<DataGrid x:Name="MyDataGrid" ItemsSource="{Binding}">
<DataGrid.Resources>
<DataTemplate x:Key="DataGridTemplate">
<ListView ItemsSource="{Binding}">
<ListView.ItemTemplate>
<DataTemplate>
<TextBlock Text="{Binding}"/>
</DataTemplate>
</ListView.ItemTemplate>
</ListView>
</DataTemplate>
</DataGrid.Resources>
<DataGrid.CellStyle>
<Style TargetType="DataGridCell">
<Setter Property="ContentTemplate" Value="{StaticResource DataGridTemplate}"/>
</Style>
</DataGrid.CellStyle>
</DataGrid>
但是当我编译并运行它时,DataGrid
只显示空单元格,即使没有绑定错误.如果我不使用任何模板,单元格显示System.Data.DataRowView System.Collections.Generic.List
1 [System. Object]`.
如果有人能看一看(我上面提供的代码是完全可重现的例子),让我知道如何创建正确的模板,我会非常感激的.或者,如果我在这方面走错了路,我也愿意接受其他建议.
编辑:澄清:在我的完整应用程序中,列和行的数量以及它们的头名称是事先不知道的,并且可能在运行时发生变化,因此必须以允许在修改或重新创建底层DataTable
时反映这些变化的方式绑定DataGrid
.