Udało mi się umożliwić dynamiczne dodawanie kolumny za pomocą zaledwie linii kodu takiego:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
Wracając do pytania, nie jest to rozwiązanie oparte na XAML (ponieważ jak wspomniano, nie ma na to rozsądnego sposobu), ani też nie jest to rozwiązanie, które działałoby bezpośrednio z DataGrid.Columns. W rzeczywistości działa z komponentem ItemsSource powiązanym z DataGrid, który implementuje ITypedList i jako taki zapewnia niestandardowe metody pobierania PropertyDescriptor. W jednym miejscu w kodzie możesz zdefiniować „wiersze danych” i „kolumny danych” dla swojej siatki.
Jeśli chciałbyś:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
możesz użyć na przykład:
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)
a Twoja siatka przy użyciu powiązania z MyItemsCollection zostanie wypełniona odpowiednimi kolumnami. Te kolumny można dynamicznie modyfikować (nowe dodane lub istniejące usunięte) w czasie wykonywania, a grid automatycznie odświeży swoją kolekcję kolumn.
Wspomniany powyżej DynamicPropertyDescriptor to tylko uaktualnienie do zwykłego PropertyDescriptor i zapewnia definicję kolumn o silnym typie z kilkoma dodatkowymi opcjami. W przeciwnym razie DynamicDataGridSource działałoby po prostu dobrze zdarzenie z podstawowym PropertyDescriptor.