2012-11-02 6 views
6

でDataGrid内のセルの値を取得することがあります:は、WinFormsのためにWPF

var value = DataGridView.Rows[0].Cells[0].Value 

は、WPFでそれを取得する方法はありますか?

+1

私はWPFに対して頭をhittinの発見、すべてのWinFormsの開発者に伝えると...あなたはリサイズから学んできたすべてのものを忘れ、これは異なる(倍優れIMO)フレームワークであり、そして全く異なる考え方が必要です。 MVVMを見て、WPFのバインド機能に慣れます –

答えて

5

私は最善の方法は、Itemsプロパティを使用することで直接あなたのデータ項目にアクセスすると思う:

var dataItem = dataGrid.Items[0] as ...; 

しかし、あなたはセルを取得し、GetValueメソッド()メソッドで値にアクセスするには、このクラスを使用することができます(もっとあなたの例に似ています)。ここから取ら

コード:datagrid get cell index

static class DataGridHelper { 
    static public DataGridCell GetCell(DataGrid dg, int row, int column) { 
     DataGridRow rowContainer = GetRow(dg, row); 

     if (rowContainer != null) { 
      DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(rowContainer); 

      // try to get the cell but it may possibly be virtualized 
      DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      if (cell == null) { 
       // now try to bring into view and retreive the cell 
       dg.ScrollIntoView(rowContainer, dg.Columns[column]); 
       cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); 
      } 
      return cell; 
     } 
     return null; 
    } 

    static public DataGridRow GetRow(DataGrid dg, int index) { 
     DataGridRow row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index); 
     if (row == null) { 
      // may be virtualized, bring into view and try again 
      dg.ScrollIntoView(dg.Items[index]); 
      row = (DataGridRow)dg.ItemContainerGenerator.ContainerFromIndex(index); 
     } 
     return row; 
    } 

    static T GetVisualChild<T>(Visual parent) where T : Visual { 
     T child = default(T); 
     int numVisuals = VisualTreeHelper.GetChildrenCount(parent); 
     for (int i = 0; i < numVisuals; i++) { 
      Visual v = (Visual)VisualTreeHelper.GetChild(parent, i); 
      child = v as T; 
      if (child == null) { 
       child = GetVisualChild<T>(v); 
      } 
      if (child != null) { 
       break; 
      } 
     } 
     return child; 
    } 
} 
3

一般的に、あなたはそれを行う必要はありません。 WPFでは、データグリッドは、セルと同じ値を持つ基になるコレクションまたはオブジェクトが存在することを意味しており、データバインディングで使用されることを意味し、あなたが直接そのコレクション/オブジェクトにアクセスする必要があります。あなたは、セルの値にアクセスする必要がされている場合は、あなたのデザインを再考する必要がある場合があります。

関連する問題