至少有三種方式這樣做的:
- 從代碼隱藏
- 使用一個DataTable作爲的ItemsSource *
使用CustomTypeDescriptor手動修改DataGrid的列
*推薦使用簡單
第一種方法:使用code-behind在運行時生成DataGrid的列。這實現起來很簡單,但也許感覺有點hackish,特別是如果你使用MVVM。所以,你有你的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
});
}
}
你會想:
<DataGrid x:Name="grid">
<DataGrid.Columns>
<DataGridTextColumn Binding="{Binding id}" Header="id" />
<DataGridTextColumn Binding="{Binding image}" Header="image" />
</DataGrid.Columns>
</DataGrid>
當你有你的「名稱」準備好了,然後通過添加/刪除列,如修改網格創建一個應該包含原始類的包裝類,以及一個包含自定義屬性的字典。比方說,你的主要行類是「用戶」,那麼你會希望有一個包裝類是這樣的:
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);
第二方法:使用DataTable。這使得在引擎蓋下使用自定義類型的基礎結構,但更易於使用。只要綁定DataGrid的ItemsSource
到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
。這允許您在運行時創建自定義類型;這反過來使您能夠告訴DataGrid,您的類型具有屬性「Name1」,「Name2」,...「NameN」或其他任何你想要的。有關此方法的一個簡單示例,請參閱here。
是顯示這些信息的唯一方法嗎? –
我不確定你要求什麼。 – Wr4thon
Johannes看到我的答案,這樣你就能明白我爲什麼這麼問了。 –