2016-04-14 85 views
0

私は、WPF DataGridの特定の列のすべての項目を取得する簡単な方法を探しています。 DataGrid、DataGridColumn、およびDataGridColumnHeaderの両方を参照として持っていますが、要素を取得する論理的な方法を見つけることはできません。WPF DataGrid - 列から項目を取得

場合によっては、カスタムヘッダーオブジェクトを使用しているため、DataGridColumnのHeaderプロパティを使用することはできません。

+0

データグリッドを使用して、ヘッダーを使用しないでください...のObservableCollection のように...構造化されたコレクションを来るようにバインドされなければならない、あなただけ行うことができますメソッドを呼び出します特定の行のMyDataClassを取得し、必要なプロパティのゲッターを使用します。 – Divisadero

+0

特定のケースではなく、汎用コントロールを準備しています。そしてそのためには、特定の列にどのプロパティがバインドされているかを知る必要はありません。私はdgとdgcの両方を供給した後、特定の列のデータグリッドの値を返す汎用ソリューションを探しています。 – fonix232

+0

とどのようにヘッダーがどのプロパティのために表示されるべきかコントロールにどのように伝えますか?私はそれから始めるでしょう – Divisadero

答えて

0

DataGridのインスタンスを既に持っているのであれば、それは簡単です。ここでは、DataGridの列にあるすべての項目の列挙を取得するために使用できる単純な拡張メソッドを示します。

namespace Extensions 
{ 
    public static class DataGridExtension 
    { 
     public static IEnumerable<FrameworkElement> GetItemsInColumn(this DataGrid dg, int col) 
     { 
      if (dg.Columns.Count <= col) 
       throw new IndexOutOfRangeException("Column " + col + " is out range, the datagrid only contains " + dg.Columns.Count + " columns."); 
      foreach (object item in dg.Items) 
      { 
       yield return dg.Columns[col].GetCellContent(item); 
      } 
     } 
    } 
} 

それからちょうどインスタンスを取得し、

dg.GetItemsInColumn(colNumber); 
+0

DataGridをバインドすると、 'dg.Items'は実際の' DataGridRow'ではなく、アイテムのコレクションを返します。各項目に実際のUI要素が必要な場合は、各項目に関連付けられたUI要素を取得するために 'ItemContainerGenerator'を使用する必要があると考えられますが、仮想化がオン(デフォルト)の場合、 UIアイテムは再利用され、データのみが変更されるためです。 – Rachel

+0

レイチェル、アイテムに直接ではなくdg.ItemsSourceにバインドしたいと思うでしょう。アイテムには、コンテンツを生成するために使用されるアイテムのリストが含まれます。これは、GetCellContentがその目的のためにオーバーロードされているためです。 https://msdn.microsoft.com/en-us/library/system.windows.controls.datagridcolumn.getcellcontent%28v=vs.110%29.aspx –

+0

おそらく私は間違っていて、DataGridは異なっていますが、アイテムのリスト(TabControl、ListBox、ComboBoxなど)を表示するための他のコントロールでは、 '.Items'プロパティは実際のUIアイテムではなく、バインドされたアイテムのリストを返します。私は、DataGridが同じ方法で動作するかどうかを検証するためにDataGridでテストを実行する必要がありますが、それはそうだと思います。また、私がこれを考えるもう一つの理由は、仮想化に関する同じ点が当てはまります。 – Rachel

関連する問題