如何在WPF数据网格中显示数组元素?

时间:2020-12-17 21:24:21

I'm trying to display a series of rows in a WPF DataGrid where each row contains an array of booleans (the number of which is the same for all rows, it's not a jagged 2D array) that I want to display as individual columns, eg.

我试图在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   |

Currently, I'm using this class for my DataGrid rows:

目前,我正在为我的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; }
}

In the real world case, make that 128 booleans. It gets the job done for the time being (for as long as nobody creates cyclic plans with a length over 128 days) but it's a rather ugly solution.

在现实世界中,选择128布尔值。它暂时完成了工作(只要没有人创建超过128天的循环计划),但这是一个相当糟糕的解决方案。

Can I somehow feed an array of booleans into the DataGrid? I've taken a look various articles on implementing ValueConverters, but I'm not sure that's what I need.

我可以以某种方式向DataGrid中输入一个布尔数组吗?我已经阅读了关于实现valueconverter的各种文章,但我不确定这是否是我所需要的。

1 个解决方案

#1


11  

I think you'll have to deal with code behind for this...

我认为你必须处理这背后的代码……

Example:

例子:

Test class:

测试类:

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;
        }
    }
}

How to generate test data & columns:

如何生成测试数据和列:

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;

What that looks like (lacks headers and everything of course)

它是什么样子的(当然没有header和所有东西)

如何在WPF数据网格中显示数组元素?


Edit: To make the above code cleaner you should expose a static property in your items-class which is used uniformly when creating the arrays, using data[0].Values.Length when creating the columns could obviously throw an exception if the data collection is empty.

编辑:为了使上面的代码更干净,您应该在items-class中公开一个静态属性,在创建数组时,使用数据[0]. values来统一使用。如果数据集合为空,创建列时的长度显然会抛出异常。

#1


11  

I think you'll have to deal with code behind for this...

我认为你必须处理这背后的代码……

Example:

例子:

Test class:

测试类:

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;
        }
    }
}

How to generate test data & columns:

如何生成测试数据和列:

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;

What that looks like (lacks headers and everything of course)

它是什么样子的(当然没有header和所有东西)

如何在WPF数据网格中显示数组元素?


Edit: To make the above code cleaner you should expose a static property in your items-class which is used uniformly when creating the arrays, using data[0].Values.Length when creating the columns could obviously throw an exception if the data collection is empty.

编辑:为了使上面的代码更干净,您应该在items-class中公开一个静态属性,在创建数组时,使用数据[0]. values来统一使用。如果数据集合为空,创建列时的长度显然会抛出异常。