Ich habe es geschafft, eine Spalte dynamisch mit nur einer Codezeile wie der folgenden hinzuzufügen:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
In Bezug auf die Frage handelt es sich weder um eine XAML-basierte Lösung (da es, wie erwähnt, keinen vernünftigen Weg gibt), noch um eine Lösung, die direkt mit DataGrid.Columns funktioniert. Es arbeitet tatsächlich mit DataGrid-gebundener ItemsSource, die ITypedList implementiert und als solche benutzerdefinierte Methoden für das Abrufen von PropertyDescriptor bereitstellt. An einer Stelle im Code können Sie "Datenzeilen" und "Datenspalten" für Ihr Raster definieren.
Wenn Sie hätten:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
Sie könnten zum Beispiel verwenden:
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)
und Ihr Raster, das die Bindung an MyItemsCollection verwendet, wird mit entsprechenden Spalten gefüllt. Diese Spalten können zur Laufzeit dynamisch geändert (neu hinzugefügt oder vorhanden entfernt) werden, und das Raster aktualisiert automatisch die Spaltensammlung.
Der oben erwähnte DynamicPropertyDescriptor ist nur ein Upgrade auf den regulären PropertyDescriptor und bietet eine stark typisierte Spaltendefinition mit einigen zusätzlichen Optionen. DynamicDataGridSource würde ansonsten mit dem grundlegenden PropertyDescriptor einwandfrei funktionieren.