如何在WPF DataGrid中以编程方式添加List<double>作为列(无绑定)
手动构建WPF DataGrid(无绑定)实现需求
嘿,我懂你要的效果——纯代码方式给WPF DataGrid生成对应列和行,完全不用绑定,还得处理不同长度子列表的空单元格问题对吧?咱直接上可行的解决方案!
第一步:XAML准备
首先确保你的DataGrid关闭自动生成列,并且命名方便后台代码访问:
<Window x:Class="YourNamespace.YourWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" Title="DataGrid Demo" Height="450" Width="800"> <Grid> <DataGrid x:Name="TargetDataGrid" AutoGenerateColumns="False" /> </Grid> </Window>
第二步:后台代码实现
在窗口的Loaded事件或者合适的地方写入以下代码,逻辑很清晰:
- 先定义你的集合:
List<List<double>> collection = new List<List<double>> { new List<double>() {1.5, 2.5, 3.5}, new List<double>() {1.5, 2.5}, new List<double>() {1.5, 2.5, 3.5, 4.5} };
- 手动创建列,数量对应集合里的子List个数:
// 为每个子集合创建一列 for (int colIdx = 0; colIdx < collection.Count; colIdx++) { var textColumn = new DataGridTextColumn { Header = $"列 {colIdx + 1}", // 设置列头 Width = DataGridLength.Auto // 自动适配宽度 }; TargetDataGrid.Columns.Add(textColumn); }
- 计算最大行数(取最长子List的长度),然后逐行创建单元格:
// 确定需要生成的总行数 int maxRowCount = collection.Max(subList => subList.Count); for (int rowIdx = 0; rowIdx < maxRowCount; rowIdx++) { var newRow = new DataGridRow(); // 为当前行生成每个列对应的单元格 foreach (var subList in collection) { var cell = new DataGridCell(); // 检查当前行索引是否在子列表范围内,超出则显示空字符串 cell.Content = rowIdx < subList.Count ? subList[rowIdx].ToString() : string.Empty; newRow.ItemCollection.Add(cell); } // 将行添加到DataGrid中 TargetDataGrid.Items.Add(newRow); }
关键细节说明
- 关闭自动生成列:必须把
AutoGenerateColumns设为False,不然会和我们手动创建的列冲突 - 空单元格处理:通过判断行索引是否小于子List的长度,来决定显示数值还是空字符串
- 动态行列数:列数由外层集合的元素个数决定,行数由最长的子List长度决定,完全适配你的集合结构
如果之后需要调整样式(比如单元格对齐、字体),可以给DataGridCell添加样式资源,或者直接设置cell.Style属性就行。
内容的提问来源于stack exchange,提问作者Giacomo Ascari
相关产品推荐
相关产品推荐

