これを行うには、少なくとも 3 つの方法があります。
- コード ビハインドから DataGrid の列を手動で変更する
- DataTable を ItemsSource として使用する *
CustomTypeDescriptor を使用する
*シンプルにすることをお勧めします
1 番目のアプローチ:コード ビハインドを使用して、実行時に DataGrid の列を生成します。これは簡単に実装できますが、特に MVVM を使用している場合は、少しハックに感じるかもしれません。したがって、固定列を持つ DataGrid を使用できます。
<DataGrid x:Name="grid">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding id}" Header="id" />
<DataGridTextColumn Binding="{Binding image}" Header="image" />
</DataGrid.Columns>
</DataGrid>
「名前」の準備ができたら、列を追加/削除してグリッドを変更します。次に例を示します。
// add new columns to the data grid
void AddColumns(string[] newColumnNames)
{
foreach (string name in newColumnNames)
{
grid.Columns.Add(new DataGridTextColumn {
// bind to a dictionary property
Binding = new Binding("Custom[" + name + "]"),
Header = name
});
}
}
元のクラスを含むラッパー クラスと、カスタム プロパティを含む辞書を作成する必要があります。メインの行クラスが「ユーザー」であるとしましょう。次に、次のようなラッパー クラスが必要です。
public class CustomUser : User
{
public Dictionary<string, object> Custom { get; set; }
public CustomUser() : base()
{
Custom = new Dictionary<string, object>();
}
}
ItemsSource
この新しい「CustomUser」クラスのコレクションを に取り込みます。
void PopulateRows(User[] users, Dictionary<string, object>[] customProps)
{
var customUsers = users.Select((user, index) => new CustomUser {
Custom = customProps[index];
});
grid.ItemsSource = customUsers;
}
たとえば、次のように結び付けます。
var newColumnNames = new string[] { "Name1", "Name2" };
var users = new User[] { new User { id="First User" } };
var newProps = new Dictionary<string, object>[] {
new Dictionary<string, object> {
"Name1", "First Name of First User",
"Name2", "Second Name of First User",
},
};
AddColumns(newColumnNames);
PopulateRows(users, newProps);
2 番目のアプローチ: DataTableを使用します。これは内部でカスタムタイプのインフラストラクチャを利用しますが、より使いやすくなっています。DataGridItemsSource
をDataTable.DefaultView
プロパティにバインドするだけです。
<DataGrid ItemsSource="{Binding Data.DefaultView}" AutoGenerateColumns="True" />
次に、好きなように列を定義できます。たとえば、次のようになります。
Data = new DataTable();
// create "fixed" columns
Data.Columns.Add("id");
Data.Columns.Add("image");
// create custom columns
Data.Columns.Add("Name1");
Data.Columns.Add("Name2");
// add one row as an object array
Data.Rows.Add(new object[] { 123, "image.png", "Foo", "Bar" });
3 番目のアプローチ: .Net の型システムの拡張性を利用します。具体的には、 を使用しCustomTypeDescriptor
ます。これにより、実行時にカスタム タイプを作成できます。これにより、タイプに「Name1」、「Name2」、...「NameN」、またはその他の必要なプロパティがあることを DataGrid に伝えることができます。このアプローチの簡単な例については、こちらを参照してください。