次のようなコード行を使用して、動的に列を追加できるようにしました。
MyItemsCollection.AddPropertyDescriptor(
new DynamicPropertyDescriptor<User, int>("Age", x => x.Age));
質問に関しては、これはXAMLベースのソリューションではありません(前述のようにそれを行う合理的な方法がないため)。また、DataGrid.Columnsを直接操作するソリューションでもありません。実際には、DataGridにバインドされたItemsSourceで動作します。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で正常に動作します。