如何在WPF DataGrid中显示数组元素?

12

我正在尝试在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
你能不能把它们放在一个集合中,然后使用数据网格的数据绑定呢? - Tony The Lion
@Tony:这正是我想做的。我只是不知道如何告诉WPF DataGrid如何显示来自集合/数组/任何其他元素。 - Cygon
1个回答

11

我认为你需要处理这个问题的代码...

例如:

测试类:

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;

这是它的样子(当然缺少标题和其他东西):

一个带有复选框的网格截图...


编辑:为了使上面的代码更加简洁,您应该在项目类中公开一个静态属性,在创建数组时统一使用它。在创建列时使用data[0].Values.Length可能会抛出异常,如果集合为空。


好痛啊,绑定语法允许我用类似于纯C#的语法指定数组索引。在谷歌上搜了一下,发现有些帖子说如果WPF可以绑定到数组索引就好了,所以我甚至没有尝试最明显的事情! - Cygon
顺便感谢你的样式技巧和详细答案(带截图!)。这些年来,我已经写了很多代码,但是我想在发布包含展开数组的代码片段后最好不要抱怨 :o) - Cygon

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接