これを行うには、少なくとも3つの方法があります:
- が
がCustomTypeDescriptor
を使用してください*のItemsSourceとしてのDataTableを使用して、コードビハインド
- から手動でDataGridの列を変更します。 *シンプル
にお勧め
第一のアプローチ:実行時にDataGridの列を生成するために使用コードビハインド。これは実装が簡単ですが、特にあなたがMVVMを使用している場合は、ちょっとハックしているかもしれません。だから、固定列を使用してデータグリッドを持っていると思います:
<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
});
}
}
あなたがお勧めしますラッパークラスを作成します。ラッパークラスには元のクラスと、カスタムプロパティーを格納する辞書が含まれている必要があります。
void PopulateRows(User[] users, Dictionary<string, object>[] customProps)
{
var customUsers = users.Select((user, index) => new CustomUser {
Custom = customProps[index];
});
grid.ItemsSource = customUsers;
}
:
public class CustomUser : User
{
public Dictionary<string, object> Custom { get; set; }
public CustomUser() : base()
{
Custom = new Dictionary<string, object>();
}
}
は、この新しい「CustomUser」クラスのコレクションをItemsSource
を移入:のはあなたのメインの行クラスは、「ユーザー」であるとしましょう、そしてあなたは、このようなラッパークラスの何かをしたいと思います
したがって、たとえば、それを一緒に結ぶ:
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);
第二アプローチ:DataTableを使用してください。これにより、カスタムタイプのインフラストラクチャがボンネット内で使用されますが、使いやすくなります。ただ、DataGridのItemsSource
DataTable.DefaultView
プロパティをバインド:
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" });
第三のアプローチ:の拡張性のメイク使用あなたが好きしかし
<DataGrid ItemsSource="{Binding Data.DefaultView}" AutoGenerateColumns="True" />
その後、あなたは、例えば列を定義することができます.Netのタイプシステム。具体的には、CustomTypeDescriptor
を使用します。これにより、実行時にカスタムタイプを作成することができます。これにより、DataGridにタイプが "Name1"、 "Name2"、... "NameN"などのプロパティを持つことを伝えることができます。このアプローチの簡単な例については、hereを参照してください。
この情報を表示する唯一の方法はありますか? –
あなたの求めるものがわかりません。 – Wr4thon
ヨハネスは私の答えを見るので、なぜ私はそれを求めているのか分かります。 –