如何从另一个按钮触发 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
元素,设置DataGrid
的CurrentCell
属性,调用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/
我知道通过双击 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
元素,设置DataGrid
的CurrentCell
属性,调用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/