如何通过DataColumn.Caption设置WPF DataGrid自动生成列的Header
方案1:通过列名匹配DataTable(优先推荐,无兼容性风险)
你完全不需要访问内部的DataColumnPropertyDescriptor,DataGridAutoGeneratingColumnEventArgs的PropertyName属性就直接对应DataColumn.ColumnName,只要你持有绑定的DataTable实例,直接通过列名查找即可:
// 首先在你的UserControl中保存绑定的DataTable引用,示例命名为_boundDataTable private void dgProviderValues_AutoGeneratedColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { if (_boundDataTable.Columns.Contains(e.PropertyName)) { DataColumn targetCol = _boundDataTable.Columns[e.PropertyName]; // 替换列头为自定义Caption e.Column.Header = targetCol.Caption; // 隐藏列逻辑示例:不需要生成的列直接设置e.Cancel = true if (targetCol.ColumnName == "内部字段名" || string.IsNullOrEmpty(targetCol.Caption)) { e.Cancel = true; } } }
该方案不依赖任何内部实现,性能和兼容性都最佳,是首选方案。
方案2:反射读取内部属性(仅适用于无法获取DataTable实例的场景)
如果你的场景无法拿到绑定的DataTable引用,可以通过反射读取PropertyDescriptor的内部Column属性:
using System.Reflection; private void dgProviderValues_AutoGeneratedColumn(object sender, DataGridAutoGeneratingColumnEventArgs e) { PropertyDescriptor pd = e.PropertyDescriptor; if (pd == null) return; // 反射获取内部Column属性 PropertyInfo colProp = pd.GetType().GetProperty("Column", BindingFlags.Instance | BindingFlags.Public | BindingFlags.NonPublic); if (colProp != null && colProp.PropertyType == typeof(DataColumn)) { DataColumn targetCol = (DataColumn)colProp.GetValue(pd); e.Column.Header = targetCol.Caption; // 隐藏列逻辑同上 } }
注意该方案依赖.NET内部类的实现细节,后续.NET版本更新如果修改了DataColumnPropertyDescriptor的实现,可能会失效。
内容的提问来源于stack exchange,提问作者Ed Johnston
相关产品推荐
相关产品推荐

