动态构建一个嵌套的WPF数据网格

本文关键字:WPF 数据 数据网 网格 嵌套 一个 构建 动态 | 更新日期: 2023-09-27 18:08:16

我在这个网站和其他网站上发现了很多代码,展示了如何在XAML中创建嵌套数据网格,但我无法找到关于如何使用c#代码获得相同结果的任何信息。我想要做的是转换这个:

<DataGrid ...>
  <DataGrid.Columns>
    <DataGridTextColumn Header="Received Date" Binding="{Binding Received}" .../>
     ...
  </DataGrid.Columns>
  <DataGrid.RowDetailsTemplate>
     <DataTemplate>
        <DataGrid ItemsSource="{Binding Details}" ...>
           <DataGrid.Columns>
              <DataGridTextColumn Header="Log Date" Binding="{Binding LogDate}" />
              ...
           </DataGrid.Columns>
         </DataGrid>
      </DataTemplate>
    </DataGrid.RowDetailsTemplate>
  <DataGrid>

转换为c#代码。

数据结构如下:

public class MessageData {
   Guid MessageId {get; set;}
   DateTime ReceivedDate { get; set; }
   ...
   List<EventDetail> Details { get; set; }
}
public class EventDetail {
   Guid MessageId { get; set; }
   DateTime LogDate { get; set; }
   string LogEvent { get; set; }
   ...
}

现在看来,除了能够定义内部数据网格中的列之外,我可以得到大部分工作-如果我将自动生成设置为true,代码就可以工作,但我无法弄清楚如何定义内部网格的列。

DataGrid dg = new DataGrid();
...
dg.IsReadOnly = true;
FrameworkElementFactory details = FrameworkElementFactory(typeof(DataGrid));
details.SetBinding(ItemsControl.ItemsSourceProperty, new Binding("Details"));
details.SetValue(DataGrid.AutoGenerateColumnsProperty, true);
DataTemplate dt = new DataTemplate(typeof(DataGrid));
dt.VisualTree = details;
dt.RowDetailsTemplate = dt;
dg.ItemsSource = myDataSouce;

这工作,但当我设置autogeneratecolcolumns为false -并尝试定义列失败…

动态构建一个嵌套的WPF数据网格

在代码隐藏中创建DataGrid只需做以下事情:

var dataGrid = new DataGrid();

DataGrid列可以在代码隐藏中添加,参见MSDN中的以下示例:

//Create a new column to add to the DataGrid
DataGridTextColumn textcol = new DataGridTextColumn();
//Create a Binding object to define the path to the DataGrid.ItemsSource property
//The column inherits its DataContext from the DataGrid, so you don't set the source
Binding b = new Binding("LastName");
//Set the properties on the new column
textcol.Binding = b;
textcol.Header = "Last Name";
//Add the column to the DataGrid
DG2.Columns.Add(textcol);
在代码隐藏中最棘手的部分可能是创建行模板。在代码中构造datatemplate已经在其他问题中讨论过了:

后面创建DataTemplate