如何从另一个按钮触发 DataGridTextColumn 编辑模式

How to trigger DataGridTextColumn edit mode from another button

我知道通过双击 DataGrid 的单元格可以设置为编辑模式。但是我怎样才能通过按钮做到这一点呢? DataGridTextColumn 的 PrepareCellForEdit 方法可能正是我需要的,对吧?任何想法如何做到这一点?

<Grid>
<DataGrid Name="MainDataGrid" ItemsSource="{Binding StringList}" AutoGenerateColumns="false" >
    <DataGrid.Columns>
        <DataGridTextColumn Binding="{Binding Name}" Width="*" IsReadOnly="False" />
    </DataGrid.Columns>
</DataGrid>

<Button Name="ButtonEdit">Edit</Button>

找到DataGridCell元素,设置DataGridCurrentCell属性,调用BeginEdit(),然后聚焦TextBox。这是一个例子:

private void ButtonEdit_Click(object sender, RoutedEventArgs e)
{
    int columnIndex = 0;

    DataGridCell cell = GetCell(MainDataGrid, MainDataGrid.ItemContainerGenerator.ContainerFromIndex(ServiceAddrDataGrid.SelectedIndex) as DataGridRow, columnIndex);
    if (cell != null)
    {
        DataGridCellInfo dataGridCellInfo = new DataGridCellInfo(cell);
        MainDataGrid.CurrentCell = dataGridCellInfo;
        MainDataGrid.BeginEdit();

        TextBox textBox = FindVisualChild<TextBox>(cell.Content as DependencyObject);
        if (textBox != null)
            textBox.Focus();
    }
}

private static DataGridCell GetCell(DataGrid dataGrid, DataGridRow rowContainer, int column)
{
    if (rowContainer != null)
    {
        DataGridCellsPresenter presenter = FindVisualChild<DataGridCellsPresenter>(rowContainer);
        if (presenter != null)
            return presenter.ItemContainerGenerator.ContainerFromIndex(column) as DataGridCell;
    }
    return null;
}

private static T FindVisualChild<T>(DependencyObject obj) where T : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is T)
            return (T)child;
        else
        {
            T childOfChild = FindVisualChild<T>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

更多信息请参考以下博客post。

如何以编程方式select并在 WPF 的 DataGrid 中聚焦行或单元格: https://blog.magnusmontin.net/2013/11/08/how-to-programmatically-select-and-focus-a-row-or-cell-in-a-datagrid-in-wpf/