Есть по крайней мере три способа сделать это:
- Изменить столбцы в 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
});
}
}
Вы хотите создать класс-оболочку, который должен содержать исходный класс, а также словарь, содержащий пользовательские свойства. Допустим, что ваш основной класс строка «User», то вы хотели бы класс обертку что-то вроде этого:
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" });
третий подход: делают использование расширяемости .Net. В частности, используйте CustomTypeDescriptor
. Это позволяет создать пользовательский тип во время выполнения; который, в свою очередь, позволяет вам сообщить DataGrid, что ваш тип имеет свойства «Name1», «Name2», ... «NameN» или любые другие, которые вы хотите. См. here для простого примера этого подхода.
Это единственный способ отображения этой информации? –
Я не уверен, что вы просите. – Wr4thon
Йоханнес видит мой ответ, так что вы можете понять, почему я спрашивал об этом. –