Мені вдалося зробити можливість динамічно додати стовпчик, використовуючи лише такий рядок коду, як цей:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
Що стосується питання, це не рішення на основі XAML (оскільки, як було сказано, немає розумного способу зробити це), не є рішенням, яке б працювало безпосередньо з DataGrid.Columns. Він фактично працює з DataSrid-зв'язаним 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 буде заповнена відповідними стовпцями. Ці стовпці можна динамічно змінювати (нові додані або наявні) видалятись під час виконання, а сітка автоматично оновить колекцію стовпців.
Згаданий вище DynamicPropertyDescriptor - це лише оновлення до звичайного PropertyDescriptor і забезпечує чітко набране визначення стовпців із деякими додатковими параметрами. В іншому випадку DynamicDataGridSource буде спрацьовувати чудовим чином з базовим PropertyDescriptor.