Выберите DataGridCell из DataGrid - PullRequest
10 голосов
/ 02 апреля 2012

У меня есть DataGrid WPF-элемент управления, и я хочу получить конкретный DataGridCell.Я знаю индексы строк и столбцов.Как я могу это сделать?

Мне нужен DataGridCell, потому что я должен иметь доступ к его Контенту.Поэтому, если у меня есть (например) столбец DataGridTextColum, мой Контент будет TextBlock объектом.

Ответы [ 3 ]

4 голосов
/ 02 апреля 2012

Вы можете использовать код, подобный этому, чтобы выбрать ячейку:

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

dataGrid.SelectedCells.Clear();
dataGrid.SelectedCells.Add(dataGridCellInfo);
dataGrid.CurrentCell = dataGridCellInfo;

Я не вижу способа обновить содержимое определенной ячейки напрямую, поэтому для обновления содержимого определенной ячейки я бы сделал следующее

// 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.
2 голосов
/ 26 июня 2012

Вы можете просто использовать этот метод расширения -

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

, и вы можете получить ячейку DataGrid по существующей строке и идентификатору столбца:

public static DataGridCell GetCell(this DataGrid grid, DataGridRow row, int column)
{
    if (row != null)
    {
        DataGridCellsPresenter presenter = GetVisualChild<DataGridCellsPresenter>(row);

        if (presenter == null)
        {
            grid.ScrollIntoView(row, grid.Columns[column]);
            presenter = GetVisualChild<DataGridCellsPresenter>(row);
        }

        DataGridCell cell = (DataGridCell)presenter.ItemContainerGenerator.ContainerFromIndex(column);
        return cell;
    }
    return null;
}

grid.ScrollIntoView isключ к выполнению этой работы, если DataGrid виртуализирован и требуемая ячейка в данный момент не отображается.

Проверьте эту ссылку для получения подробной информации - Получить строку и ячейку WPF DataGrid

1 голос
/ 02 апреля 2013

Вот код, который я использовал:

    /// <summary>
    /// Get the cell of the datagrid.
    /// </summary>
    /// <param name="dataGrid">The data grid in question</param>
    /// <param name="cellInfo">The cell information for a row of that datagrid</param>
    /// <param name="cellIndex">The row index of the cell to find. </param>
    /// <returns>The cell or null</returns>
    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<DataGridCellsPresenter>(row);

                    if (presenter != null)
                    {
                        result = presenter.ItemContainerGenerator.ContainerFromIndex(columnIndex) as DataGridCell;
                    }
                    else
                    {
                        result = null;
                    }
                }
            }
        }

        return result;
    }`

Предполагается, что DataGrid уже загружен (выполнен собственный обработчик Loaded).

...