Selecione DataGridCell de DataGrid

Eu tenho um controle DataGrid WPF e eu quero obter um DataGridCell específico. Eu conheço os índices de linha e coluna. Como posso fazer isso?

Eu preciso do DataGridCell porque eu tenho que ter access ao seu conteúdo. Então, se eu tiver (por exemplo) uma coluna de DataGridTextColum , meu conteúdo será um object TextBlock .

Você pode usar código semelhante a este para selecionar uma célula:

 var dataGridCellInfo = new DataGridCellInfo( dataGrid.Items[rowNo], dataGrid.Columns[colNo]); dataGrid.SelectedCells.Clear(); dataGrid.SelectedCells.Add(dataGridCellInfo); dataGrid.CurrentCell = dataGridCellInfo; 

Eu não consigo ver uma maneira de atualizar o conteúdo de uma célula específica diretamente, então, para atualizar o conteúdo de uma célula específica, eu faria o seguinte

 // gets the data item bound to the row that contains the current cell // and casts to your data type. var item = dataGrid.CurrentItem as MyDataItem; if(item != null){ // update the property on your item associated with column 'n' item.MyProperty = "new value"; } // assuming your data item implements INotifyPropertyChanged the cell will be updated. 

Você pode simplesmente usar este método de extensão

 public static DataGridRow GetSelectedRow(this DataGrid grid) { return (DataGridRow)grid.ItemContainerGenerator.ContainerFromItem(grid.SelectedItem); } 

e você pode obter uma célula de um DataGrid por um ID de linha e coluna existente:

 public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column) { if (row != null) { DataGridCellsPresenter presenter = GetVisualChild(row); if (presenter == null) { grid.ScrollIntoView(row, grid.Columns[column]); presenter = GetVisualChild(row); } DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column); return cell; } return null; } 

grid.ScrollIntoView é a chave para fazer isso funcionar, caso o DataGrid seja virtualizado e a célula necessária não esteja sendo visualizada atualmente.

Verifique este link para obter detalhes – Obter linha e célula do DataGrid do WPF

Aqui está o código que usei:

  ///  /// Get the cell of the datagrid. ///  /// The data grid in question /// The cell information for a row of that datagrid /// The row index of the cell to find.  /// The cell or null private DataGridCell TryToFindGridCell(DataGrid dataGrid, DataGridCellInfo cellInfo, int cellIndex = -1) { DataGridRow row; DataGridCell result = null; if (dataGrid != null && cellInfo != null) { if (cellIndex < 0) { row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromItem(cellInfo.Item); } else { row = (DataGridRow)dataGrid.ItemContainerGenerator.ContainerFromIndex(cellIndex); } if (row != null) { int columnIndex = dataGrid.Columns.IndexOf(cellInfo.Column); if (columnIndex > -1) { DataGridCellsPresenter presenter = this.FindVisualChild(row); if (presenter != null) { result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell; } else { result = null; } } } } return result; }` 

Isso pressupõe que o DataGrid já foi carregado (executado seu próprio manipulador carregado).