18

このスニペットを使用して、データグリッドで選択した行を分析しています。

for (int i = 0; i < dgDetalle.Items.Count; i++)
{
    DataGridRow row = (DataGridRow)dgDetalle.ItemContainerGenerator.ContainerFromIndex(i);
    FrameworkElement cellContent = dgDetalle.Columns[0].GetCellContent(row);
    // ... code ...
}

サイクルはスムーズに実行されますが、特定のインデックスを処理するときに、2 行目で null 例外がスローされます。MSDN のドキュメントには、ItemContainerGenerator.ContainerFromIndex(i)「アイテムが実現されていない場合」に null が返されると記載されていますが、これは、目的の値を取得する方法を推測するのに役立ちません。

すべての行をスキャンするにはどうすればよいですか? 他に方法はありますか?

アップデート

ここでCheckBox説明されているように、このスニペットを使用して a を読み取ります。だから、いろいろ変えないとバインディングとか全然使えない。そして、私はできません。コードのメンテナンスを行っています。ItemSource

4

5 に答える 5

21

これを試して、

DataGridRow row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        if (row == null)
        {
                          grid.UpdateLayout();
            grid.ScrollIntoView(grid.Items[index]);
            row = (DataGridRow)grid.ItemContainerGenerator.ContainerFromIndex(index);
        }
于 2015-01-06T05:32:58.760 に答える
11

DataGridアイテムを仮想化しており、それぞれの行(つまり、コンテナー)は、行が表示されている場合にのみ作成されます。

仮想化をオフにするか(アイテムが多い場合は初回の読み込みが非常に遅くなり、メモリ使用量も高くなります)、データを繰り返し処理して、バインドする必要があるデータオブジェクトのプロパティの値を確認することができます。データグリッドに。通常、UI要素はまったく必要ありません...

于 2012-05-14T21:41:04.480 に答える
3

このサブスクリプションを使用:

TheListBox.ItemContainerGenerator.StatusChanged += (sender, e) =>
{
  TheListBox.Dispatcher.Invoke(() =>
  {
     var TheOne = TheListBox.ItemContainerGenerator.ContainerFromIndex(0) as ListBoxItem;
       if (TheOne != null)
         // Use The One
  });
};
于 2014-04-26T13:14:24.787 に答える