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 的各种文章,但我不确定这是否是我需要的。

4

1 回答 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,如果数据集合为空,则在创建列时使用显然会引发异常。

于 2011-04-07T14:25:40.103 回答