Как отобразить элементы массива в 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;

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

A screenshot of a grid with checkboxes...


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