Saya berhasil memungkinkan untuk menambahkan kolom secara dinamis hanya dengan menggunakan sebaris kode seperti ini:
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
Mengenai pertanyaan, ini bukan solusi berbasis XAML (karena seperti yang disebutkan tidak ada cara yang masuk akal untuk melakukannya), juga bukan solusi yang akan beroperasi langsung dengan DataGrid.Columns. Ini benar-benar beroperasi dengan ItemsSource terikat DataGrid, yang mengimplementasikan ITypedList dan dengan demikian menyediakan metode kustom untuk pengambilan PropertyDescriptor. Di satu tempat dalam kode, Anda dapat menentukan "baris data" dan "kolom data" untuk kisi Anda.
Jika Anda ingin:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
Anda bisa menggunakan misalnya:
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)
dan grid Anda menggunakan pengikatan ke MyItemsCollection akan diisi dengan kolom yang sesuai. Kolom tersebut dapat dimodifikasi (baru ditambahkan atau yang sudah ada dihapus) pada waktu proses secara dinamis dan grid akan secara otomatis menyegarkan koleksi kolomnya.
DynamicPropertyDescriptor yang disebutkan di atas hanyalah peningkatan ke PropertyDescriptor biasa dan memberikan definisi kolom yang sangat diketik dengan beberapa opsi tambahan. DynamicDataGridSource sebaliknya akan bekerja dengan baik pada acara dengan PropertyDescriptor dasar.