Как отобразить элементы массива в WPF DataGrid?
Я пытаюсь отобразить ряд строк в DataGrid WPF, где каждая строка содержит массив логических значений (количество которых одинаково для всех строк, это не зубчатый 2D-массив), который я хочу отобразить как отдельные столбцы, например.
Name | Day 1 | Day 2 | Day 3 | Day 4 | Day 5 | Day 6 |
-----------------------------------------------------------------
Bring out Trash | X | | X | | | X |
Pay Bills | | | | | X | |
Commit Suicide | | | | | | X |
В настоящее время я использую этот класс для своих строк DataGrid:
private class GridRow {
public string Name { get; set; }
public char Day1 { get; set; }
public char Day2 { get; set; }
public char Day3 { get; set; }
public char Day4 { get; set; }
public char Day5 { get; set; }
public char Day6 { get; set; }
public char Day7 { get; set; }
public char Day8 { get; set; }
public char Day9 { get; set; }
}
в случае реального мира сделайте это 128 логическими. Он получает работу на время (пока никто не создает циклические планы с длиной более 128 дней), но это довольно уродливое решение.
могу ли я каким-то образом передать массив логических значений в DataGrid? Я просмотрел различные статьи о реализации ValueConverters, но я не уверен, что это то, что мне нужно.
1 ответов
Я думаю, вам придется иметь дело с кодом для этого...
пример:
тест класс:
public class TestRow
{
private bool[] _values = new bool[10];
public bool[] Values
{
get { return _values; }
set { _values = value; }
}
public TestRow(int seed)
{
Random random = new Random(seed);
for (int i = 0; i < Values.Length; i++)
{
Values[i] = random.Next(0, 2) == 0 ? false : true;
}
}
}
как генерировать тестовые данные и столбцы:
DataGrid grid = new DataGrid();
var data = new TestRow[] { new TestRow(1), new TestRow(2), new TestRow(3) };
grid.AutoGenerateColumns = false;
for (int i = 0; i < data[0].Values.Length; i++)
{
var col = new DataGridCheckBoxColumn();
//Here i bind to the various indices.
var binding = new Binding("Values[" + i + "]");
col.Binding = binding;
grid.Columns.Add(col);
}
grid.ItemsSource = data;
как это выглядит (не хватает заголовков И все, конечно)
Edit: чтобы сделать вышеуказанный код чище, вы должны предоставить статическое свойство в своем items-class, которое используется равномерно при создании массивов, используя data[0].Values.Length
при создании столбцов, очевидно, может возникнуть исключение, если сбор данных пуст.