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