Как я могу отображать элементы массива в WPF DataGrid?

Я пытаюсь отобразить ряд строк в WPF DataGrid, где каждая строка содержит массив логических чисел (число которых одинаково для всех строк, это не зубчатый 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;

Как выглядит (не хватает заголовков и всего, конечно)

A screenshot of a grid with checkboxes...


Изменить: Чтобы сделать вышеописанный очиститель кода, вы должны открыть статическое свойство в вашем классе элементов, которое равномерно используется при создании массивов, используя data[0].Values.Length при создании столбцов, очевидно, может исключение, если сбор данных пуст.