动态构建一个嵌套的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 -并尝试定义列失败…
在代码隐藏中创建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已经在其他问题中讨论过了:
在