udało mi się zrobić to możliwe, aby dynamicznie dodać kolumnę używając tylko wiersza kodu:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
Dotyczy do pytania, to nie jest rozwiązaniem XAML oparte (ponieważ jak wspomniano istnieje nie ma racjonalnego sposobu, aby to zrobić), ani nie jest rozwiązaniem, które działałoby bezpośrednio z DataGrid.Columns. To faktycznie działa z DataGrid związanym ItemsSource, który implementuje ITypedList i jako taki zapewnia niestandardowe metody pobierania właściwości PropertyDescriptor. W jednym miejscu kodu możesz zdefiniować "wiersze danych" i "kolumny danych" dla swojej siatki.
Jeśli chcesz mieć:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
można 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 wiązanie z użyciem siatki MyItemsCollection byłyby wypełniane odpowiednich kolumnach. Te kolumny można modyfikować (nowe dodane lub istniejące usunięte) w czasie wykonywania dynamicznie, a siatka automatycznie odświeży kolekcję kolumn.
DynamicPropertyDescriptor wspomniany powyżej jest jedynie aktualizacją do zwykłego PropertyDescriptor i zapewnia silnie typowaną definicję kolumn z dodatkowymi opcjami. DynamicDataGridSource w przeciwnym razie działałby po prostu dobrze z podstawowym PropertyDescriptor.
To jest poprawna odpowiedź, Bravo! –
Zgadzam się, najbardziej lubię to rozwiązanie. – Jaime
ładne rozwiązanie dla wzorca MVVM – WPFKK