2012-11-02 24 views
6

對於的WinForms它是:WPF中獲取細胞的值在DataGrid中

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

有什麼辦法得到它在WPF?

+1

正如我告訴每個winforms開發人員,我發現他的頭對WPF ...忘了你從winforms中學到的一切,這是一個不同的(更好的IMO)框架,需要一個完全不同的思維模式。看看MVVM並熟悉WPF綁定功能 –

回答

5

我認爲最好的辦法是使用Items屬性和直接訪問您的數據項:

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

,但你可以使用這個類來獲取細胞並用的GetValue訪問value()方法(會更像你的例子)。從這裏取

代碼: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中,datagrid意味着與數據綁定一起使用,這意味着存在與單元格具有相同值的底層集合或對象,因此您需要直接訪問該集合/對象。如果您需要訪問單元格值,則可能需要重新考慮設計。