我设法使仅使用一行代码就可以动态添加列,如下所示:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
关于这个问题,这不是基于XAML的解决方案(因为如上所述,没有合理的方法来实现),也不是可以直接与DataGrid.Columns一起使用的解决方案。它实际上与DataGrid绑定的ItemsSource一起运行,ItemSource实现ITypedList并因此提供了用于PropertyDescriptor检索的自定义方法。在代码的一处,您可以为网格定义“数据行”和“数据列”。
如果您有:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
您可以使用例如:
var descriptors= new List<PropertyDescriptor>();
//retrieve column name from preprepared list or retrieve from one of the items in dictionary
foreach(var columnName in ColumnNames)
descriptors.Add(new DynamicPropertyDescriptor<Dictionary, string>(ColumnName, x => x[columnName]))
MyItemsCollection = new DynamicDataGridSource(Rows, descriptors)
使用绑定到MyItemsCollection的网格将填充相应的列。这些列可以在运行时动态修改(添加或删除的新列),并且Grid会自动刷新其列集合。
上面提到的DynamicPropertyDescriptor只是常规PropertyDescriptor的升级,并提供带有一些其他选项的强类型列定义。否则,DynamicDataGridSource使用基本的PropertyDescriptor可以正常工作。