按 F2 时,将光标放在 DataGridTemplateColumn 内的可编辑组合框上



我有一个DataGrid和一个可编辑的DataGridComboBoxColumn列。

我希望水平居中此组合框列的内容。我尝试了很多方法,找到了很多解决方案,但没有一个对我有用。然后我想出了这个解决方案。(使用DataGridTemplateColumn内部的ComboBox)

问题是在我的情况下,ComboBox是可编辑的。因此,当用户按F2键编辑ComboBox单元格的内容时,焦点不会出现在可编辑ComboBox内。但是,鼠标单击该单元格是有效的。我假设这显然是因为组合框位于模板列类型内。但是我希望光标出现在组合框中,当用户在聚焦在该单元格上时按 F2 时,它变得可编辑。

我该怎么做?

您可以处理DataGridPreparingCellForEdit事件,在可视化树中找到TextBox并通过调用Keyboard.Focus方法聚焦它:

private void dataGrid_PreparingCellForEdit(object sender, DataGridPreparingCellForEditEventArgs e)
{
var textBox = GetChildOfType<TextBox>(e.EditingElement);
if (textBox != null)
Keyboard.Focus(textBox);
}
private static T GetChildOfType<T>(DependencyObject depObj) where T : DependencyObject
{
if (depObj == null)
return null;
for (int i = 0; i < VisualTreeHelper.GetChildrenCount(depObj); i++)
{
var child = VisualTreeHelper.GetChild(depObj, i);
var result = (child as T) ?? GetChildOfType<T>(child);
if (result != null) return result;
}
return null;
}

<DataGrid PreparingCellForEdit="dataGrid_PreparingCellForEdit">
<DataGrid.Columns>
<DataGridTextColumn Header="test" Binding="{Binding Name}" />
<DataGridTemplateColumn>
<DataGridTemplateColumn.CellTemplate>
<DataTemplate>
<TextBlock Text="..." />
</DataTemplate>
</DataGridTemplateColumn.CellTemplate>
<DataGridTemplateColumn.CellEditingTemplate>
<DataTemplate>
<ComboBox IsEditable="True"
FocusManager.FocusedElement="{Binding RelativeSource={RelativeSource Self}}"
GotFocus="ComboBox_GotFocus">
<ComboBoxItem>1</ComboBoxItem>
<ComboBoxItem>2</ComboBoxItem>
<ComboBoxItem>3</ComboBoxItem>
</ComboBox>
</DataTemplate>
</DataGridTemplateColumn.CellEditingTemplate>
</DataGridTemplateColumn>
</DataGrid.Columns>
</DataGrid>

最新更新