如何在WPF DataGrid中水平展示List<int>的每个元素至独立单元格
解决方案
第一步:修改MainWindow.xaml
保留固定列(Num、Name),删除原有硬编码的Test相关列,修改后DataGrid部分代码如下:
<DataGrid AutoGenerateColumns="False" Name="dataGrid" HorizontalAlignment="Left" Margin="10,10,10,10"> <DataGrid.Columns> <DataGridTextColumn Binding="{Binding Num}" ClipboardContentBinding="{x:Null}" Header="Num" IsReadOnly="True" Width="50"/> <DataGridTextColumn Binding="{Binding Name}" ClipboardContentBinding="{x:Null}" Header="Name" IsReadOnly="True" Width="100"/> </DataGrid.Columns> </DataGrid>
第二步:修改MainWindow.xaml.cs,增加动态生成列逻辑
在给DataGrid赋值ItemsSource后,根据第一行数据的Test_List长度动态生成对应数量的列,绑定List的索引位置,完整代码如下:
using System.Collections.Generic; using System.Windows; using System.Windows.Controls; using System.Windows.Data; namespace WpfApp1 { public partial class MainWindow : Window { public MainWindow() { InitializeComponent(); List<CatModel> result = new List<CatModel>(); result.Add(new CatModel(1, "AA", new List<int> { 1, 2, 3 })); result.Add(new CatModel(2, "BB", new List<int> { 4, 5, 6 })); result.Add(new CatModel(3, "CC", new List<int> { 7, 8, 9 })); this.dataGrid.ItemsSource = result; // 动态生成Test_List对应的列 if (result.Count > 0) { int elementCount = result[0].Test_List.Count; for (int i = 0; i < elementCount; i++) { DataGridTextColumn column = new DataGridTextColumn(); column.Header = $"Test_{i + 1}"; column.Binding = new Binding($"Test_List[{i}]"); column.IsReadOnly = true; column.Width = new DataGridLength(1, DataGridLengthUnitType.Star); this.dataGrid.Columns.Add(column); } } } } }
实现说明
- WPF的绑定语法原生支持集合索引器,
{Binding Test_List[0]}可以直接取到Test_List中第1个元素的值 - 动态列生成逻辑会根据第一行数据的List长度自动生成对应数量的列,只要所有行的List长度一致就能正常展示,符合支持任意数量元素的需求
- 不需要修改CatModel的代码
内容的提问来源于stack exchange,提问作者IanHacker
相关产品推荐
相关产品推荐

