J'ai réussi à rendre possible l'ajout dynamique d'une colonne en utilisant juste une ligne de code comme celle-ci:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
En ce qui concerne la question, il ne s'agit pas d'une solution basée sur XAML (car comme mentionné, il n'y a pas de moyen raisonnable de le faire), ni d'une solution qui fonctionnerait directement avec DataGrid.Columns. Il fonctionne en fait avec ItemsSource liés à DataGrid, qui implémente ITypedList et en tant que tel fournit des méthodes personnalisées pour la récupération de PropertyDescriptor. En un seul endroit du code, vous pouvez définir des «lignes de données» et des «colonnes de données» pour votre grille.
Si vous aviez:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
vous pouvez utiliser par exemple:
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)
et votre grille utilisant la liaison à MyItemsCollection serait remplie avec les colonnes correspondantes. Ces colonnes peuvent être modifiées (ajoutées ou supprimées existantes) au moment de l'exécution de manière dynamique et la grille actualisera automatiquement sa collection de colonnes.
DynamicPropertyDescriptor mentionné ci-dessus est juste une mise à niveau vers PropertyDescriptor standard et fournit une définition de colonnes fortement typées avec quelques options supplémentaires. DynamicDataGridSource fonctionnerait autrement très bien avec PropertyDescriptor de base.