Как я могу отобразить элементы массива в WPF DataGrid? - PullRequest
11 голосов
/ 07 апреля 2011

Я пытаюсь отобразить ряд строк в WPF DataGrid, где каждая строка содержит массив логических значений (число которых одинаково для всех строк, это не зубчатый двумерный массив), которые я хочу отобразить какотдельные столбцы, например.

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 Ответ

11 голосов
/ 07 апреля 2011

Я думаю, вам придется иметь дело с кодом для этого ...

Пример:

Тестовый класс:

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...


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

...