如何以编程方式为DataGrid添加列与行单元格?绑定值不显示排查
嘿,我之前也碰到过一模一样的问题!列标题显示正常但单元格空着,多半是绑定环节出了小问题,咱们一步步排查:
绑定路径的大小写/拼写错误
C#是大小写敏感的,反射拿到的属性名必须和实体类里的属性名完全一致。比如你反射得到的是"UserName",但实体类里是"userName",绑定直接就失效了。建议在创建列的时候打印一下属性名,和实体类的定义对比确认。反射没拿到正确的public属性
如果你反射的时候没指定BindingFlags.Public | BindingFlags.Instance,可能会拿到private或者静态属性,但WPF绑定只能访问public的实例属性。检查你的反射代码,是不是用了正确的标记:var properties = targetObj.GetType().GetProperties(BindingFlags.Public | BindingFlags.Instance);ItemsSource根本没正确设置
列标题能显示,说明列创建成功了,但单元格没值很大概率是DataGrid的ItemsSource没绑定对。比如你只创建了列,但没把数据集合赋值给dataGrid.ItemsSource,或者赋值的集合是空的,甚至集合里的对象类型和你反射的样本对象不一致。DataContext出了问题
每个DataGridRow的DataContext应该对应你的数据对象实例。如果ItemsSource是正确的,行的DataContext会自动设置,但如果手动修改过DataContext,就会导致绑定找不到属性。调试的时候可以右键行,查看“DataContext”的值是否正确。列类型或绑定配置不对
比如你用了DataGridTextColumn但绑定的是复杂类型,虽然WPF会自动转字符串,但如果需要特殊格式得加StringFormat;要是用了DataGridTemplateColumn,但模板里的控件没设置绑定,那肯定也显示不了值。另外,如果你的属性值会动态变化,还得让实体类实现INotifyPropertyChanged接口,不然UI不会更新。查看绑定错误日志
这是WPF排查绑定问题的神器!打开Visual Studio的“输出”窗口,选择“调试”输出,过滤“绑定”相关内容,就能看到绑定失败的具体原因(比如找不到属性、权限不足等)。
给你一个正确的示例代码参考:
public void ConfigureDataGrid(DataGrid dataGrid, object sampleEntity) { dataGrid.Columns.Clear(); var entityType = sampleEntity.GetType(); // 只获取public实例属性 var properties = entityType.GetProperties(BindingFlags.Public | BindingFlags.Instance); foreach (var prop in properties) { var textColumn = new DataGridTextColumn { Header = prop.Name, // 绑定路径直接用属性名,确保大小写一致 Binding = new Binding(prop.Name) // 要是需要格式化数值/日期,可以加这个 // Binding = new Binding(prop.Name) { StringFormat = "{} {0:C}" } }; dataGrid.Columns.Add(textColumn); } // 这里替换成你的实际数据集合,类型要和sampleEntity一致 var dataCollection = GetYourDataCollection(); dataGrid.ItemsSource = dataCollection; }
内容的提问来源于stack exchange,提问作者Artleks

