12

各行にブール値の配列が含まれている 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   |

現在、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 に答える