次のようなコード行を使用して、列を動的に追加できるようにすることができました。
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
質問に関しては、これは XAML ベースのソリューションではなく (前述のようにそれを行うための合理的な方法がないため)、DataGrid.Columns を直接操作するソリューションでもありません。実際には DataGrid にバインドされた ItemsSource で動作します。これは ITypedList を実装し、PropertyDescriptor 取得用のカスタム メソッドを提供します。コード内の 1 か所で、グリッドの「データ行」と「データ列」を定義できます。
あなたが持っている場合:
IList<string> ColumnNames { get; set; }
//dict.key is column name, dict.value is value
Dictionary<string, string> Rows { get; set; }
たとえば、次のように使用できます。
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)
MyItemsCollection へのバインドを使用するグリッドには、対応する列が入力されます。これらの列は実行時に動的に変更 (新規追加または既存の削除) でき、グリッドは列コレクションを自動的に更新します。
上記の DynamicPropertyDescriptor は、通常の PropertyDescriptor の単なるアップグレードであり、いくつかの追加オプションを使用して厳密に型指定された列定義を提供します。それ以外の場合、DynamicDataGridSource は、基本的な PropertyDescriptor を使用したイベントで正常に機能します。