Pregunta

Estoy usando un cuadro automático del kit de herramientas WPF dentro de una plantilla de edición de DataGridTemplateColumn en WPF4. Funciona lo suficientemente bien en su mayor parte una vez que resolví todos los problemas vinculantes en torno a la vinculación de datagrí y también los propios gotchas e incompletos de AutocompleteBox. Hasta aquí todo bien. El problema es la navegación del teclado.

Este es el escenario: hay un DataGrid con dos columnas. El primero es una DataGridTemplateColumn que tiene un cuadro de autocomplete en su plantilla de edición. El segundo es solo una ordinaria dataGridTextColumn.

Si invoco la edición de una fila, puedo elegir un elemento en el cuadro de autocomplete. Presiono la pestaña para que se mueva a la siguiente columna, pero en su lugar, la edición de fila se compromete, y el enfoque del teclado no se mueve a la siguiente columna. Si se tratara de DataGridTextColumn, permanecería en modo de edición y me dejaría editar la siguiente columna. Esto también sucede para nuevas filas.

En mi opinión, parece que hay algo mal con el lugar donde WPF decide enviar el enfoque del teclado cuando sale de la caja de autocompletete, pero no puedo entender qué puedo hacer al respecto, y tampoco he podido encontrar Cualquiera que hable sobre el mismo problema, lo que sugiere que estoy haciendo algo mal o a nadie más le importa la navegación del teclado a través de sus redes. He estado utilizando una subclase TemplateColumn que anula PrepareCellForediting para garantizar que el enfoque aterrice en el cuadro de autocomplete inmediatamente en la edición de la celda (según otras respuestas aquí), pero el problema persiste si deshabilito todo ese código, por lo que no es un efecto de ese bit de ese bit de ese bit de Engaño por lo que puedo decir.

¿Algunas ideas?

El XAML se parece más o menos a esto (simplificado, por supuesto, la cuadrícula tiene muchas más de dos columnas y algunos enlaces de datos bastante complicados: he dejado de lado los enlaces y lo mantuve en la estructura general).

<DataGrid>
  <DataGridTemplateColumn Header="AutoCompleteBox">
    <DataGridTemplateColumn.CellTemplate>
      <DataTemplate><TextBlock /></DataTemplate>
    </DataGridTemplateColumn.CellTemplate>
    <DataGridTemplateColumn.CellEditingTemplate>
      <DataTemplate>
        <toolkit:AutoCompleteBox>
          <!-- autocompletebox's item template etc. -->
        </toolkit:AutoCompleteBox>
      </DataTemplate>
    </DataGridTemplateColumn.CellEditingTemplate>
  </DataGridTemplateColumn>
  <DataGridTextColumn Header="Text" />
</DataGrid>
¿Fue útil?

Solución

Para mover el enfoque a la siguiente columna que he hecho la clase extendida (la pestaña funciona bien para mí):

public class ExAutoCompleteBox : AutoCompleteBox
{
        public ExAutoCompleteBox()
        {
            PreviewKeyUp += (o, e) =>
            {
                if (e.Key == Key.Enter)
                {
                    ((UIElement)Keyboard.FocusedElement).MoveFocus(new TraversalRequest(FocusNavigationDirection.Next));
                }
            };
        }
}
Licenciado bajo: CC-BY-SA con atribución
No afiliado a StackOverflow
scroll top