Мне удалось сделать возможным динамическое добавление столбца, используя только такую строку кода:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
Что касается вопроса, это не решение на основе XAML (поскольку, как уже упоминалось, нет разумного способа сделать это), а также решение, которое будет работать напрямую с DataGrid.Columns. Фактически он работает с ItemsSource, привязанным к DataGrid, который реализует 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, будет заполнена соответствующими столбцами. Эти столбцы можно изменять (добавлять новые или удалять существующие) во время выполнения динамически, и сетка автоматически обновляет коллекцию столбцов.
Упомянутый выше DynamicPropertyDescriptor является просто обновлением обычного PropertyDescriptor и обеспечивает определение строго типизированных столбцов с некоторыми дополнительными параметрами. В противном случае DynamicDataGridSource отлично работал бы с базовым PropertyDescriptor.