Tal vez me falta algo, pero no puedo encontrar ningún método simple de hacer esto, aquí sería un esbozo de lo que podría hacer:
<ListView.InputBindings>
<KeyBinding Key="Tab" Command="{Binding GoToNextItem}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" />
<KeyBinding Modifiers="Shift" Key="Tab" Command="{Binding GoToPreviousItem}"
CommandParameter="{Binding RelativeSource={RelativeSource AncestorType=ListView}}" />
</ListView.InputBindings>
<ListView.ItemContainerStyle>
<Style TargetType="{x:Type ListViewItem}">
<EventSetter Event="Selected" Handler="ItemSelected" />
</Style>
</ListView.ItemContainerStyle>
<ListView.View>
<GridView>
<GridViewColumn Header="number" />
<GridViewColumn Header="Selector">
<GridViewColumn.CellTemplate>
<DataTemplate>
<TextBox Name="_tb" Text="{Binding SelectorName}"/>
</DataTemplate>
</GridViewColumn.CellTemplate>
</GridViewColumn>
</GridView>
</ListView.View>
cosas que hizo aquí:
- pestaña anular el comportamiento al fuego de los comandos para seleccionar otro elemento
- Agregar controlador de eventos al evento seleccionado para enfocar el cuadro de texto
- Nombre cuadro de texto para que pueda ser encontrado y se centró
Código:
private readonly ICommand _GoToNextItem = new Command((p) =>
{
var lv = p as ListView;
if (lv.SelectedIndex == -1 || lv.SelectedIndex == lv.Items.Count - 1)
{
lv.SelectedIndex = 0;
}
else
{
lv.SelectedIndex++;
}
});
public ICommand GoToNextItem { get { return _GoToNextItem; } }
private readonly ICommand _GoToPreviousItem = new Command((p) =>
{
var lv = p as ListView;
if (lv.SelectedIndex <= 0)
{
lv.SelectedIndex = lv.Items.Count - 1;
}
else
{
lv.SelectedIndex--;
}
});
public ICommand GoToPreviousItem { get { return _GoToPreviousItem; } }
private void ItemSelected(object sender, RoutedEventArgs e)
{
var item = sender as ListBoxItem;
(FindNamedChild(item, "_tb") as TextBox).Focus();
}
public static object FindNamedChild(DependencyObject container, string name)
{
if (container is FrameworkElement)
{
if ((container as FrameworkElement).Name == name) return container;
}
var ccount = VisualTreeHelper.GetChildrenCount(container);
for (int i = 0; i < ccount; i++)
{
var child = VisualTreeHelper.GetChild(container, i);
var target = FindNamedChild(child, name);
if (target != null)
{
return target;
}
}
return null;
}
Esto es muy incompleta, utilice ninguna parte de esto bajo su propio riesgo. (el enfoque también se podría haber hecho de otra manera sin traer la selección en este creo)
(La clase Command
es sólo una aplicación genérica de ICommand
que tiene una lambda que se ejecuta en Execute
método de la interfaz)
Gracias H.B. en realidad terminé sin usarlo, ya que era molesto cuando tenías muchos cuadros de texto que no saldrías del ListView aunque quisieras. Y no tenía idea de que SHIFT + TAB puede seleccionar TreeviewItem nuevamente y luego puede iterar con las flechas hacia arriba y hacia abajo, y aún tiene la opción de presionar la tecla Tab para salir de TreeView hacia el siguiente control. –
@Mohamed Cheri: Sí, ser atrapado con pestañas no es muy conveniente. Espero que esto todavía sea de algunos para ti. –