Problema de enfoque con WPF DataGrid
-
27-10-2019 - |
Pregunta
Estoy usando wpftoolkit DataGrid
para mostrar datos; En mi caso de uso
- El usuario hace clic en una celda y entra en un valor (atrajo el evento y establezco el enfoque en el
TextBox
) - Presiones enter
- El valor se comete
- El enfoque cambia a la siguiente celda
Ahora, el usuario no puede ingresar ningún valor en el TextBox
(en el DataGridCell
) a menos que haga clic en la celda. los TextBox
puede ser parte de varios controles (como NumericUpDown
, Calendar
etc.).
Este comportamiento es similar a Excel, pero no puedo cambiar el enfoque a los subyacentes TextBox
Como varios otros controles de usuario de envoltura están ahí en el DataGridCell
(algo como DataGridCell
contiene MatrixCellContainer
, que contiene MatrixCell
, que contiene UpDown
Control)
Cualquier puntero será realmente útil.
Actualizar:
Puedo lograr lo que estoy buscando al manejar DataGridCell_Selected
evento como este:
private void DataGridCell_Selected(object sender, RoutedEventArgs e)
{
Microsoft.Windows.Controls.DataGridCell dataGridCell =
sender as Microsoft.Windows.Controls.DataGridCell;
// ToDo: This is a very bad hack;
// should be replaced by some proper technique
if (dataGridCell != null)
{
NumericUpDownBase<int>[] IntUpDownControls =
dataGridCell.GetChildrenOfType<NumericUpDownBase<int>>();
if (IntUpDownControls.Count() != 0)
{
IntUpDownControls[0].Focus();
//Keyboard.Focus(IntUpDownControls[0]);
}
else
{
NumericUpDownBase<double>[] DblUpDownControls =
dataGridCell.GetChildrenOfType<NumericUpDownBase<Double>>();
if (DblUpDownControls.Count() != 0)
{
DblUpDownControls[0].Focus();
//Keyboard.Focus(DblUpDownControls[0]);
}
}
}
}
¡Pero sé que habrá una mejor manera de lograr esto!
Solución 2
Finalmente me establecí con esto -
private void HandleCellSelected(object sender, RoutedEventArgs e)
{
DataGridCell dataGridCell = sender as DataGridCell;
if (dataGridCell != null)
{
TextBox[] textboxcontrols = dataGridCell.GetChildrenOfType<TextBox>();
if (textboxcontrols.Count() != 0)
{
textboxcontrols[0].Focus();
}
}
}
Sin embargo, todavía busco un mejor enfoque ...
Otros consejos
¿Cómo está configurando el enfoque en la siguiente celda?
WPF tiene dos versiones de enfoque, enfoque lógico y enfoque de teclado. Sospecho que estás usando myDataGridCell.Focus()
, que solo establece un enfoque lógico.
myDataGridCell.Focus(); // Sets Logical Focus
Keyboard.Focus(myDataGridCell); // Sets Keyboard Focus