J'ai un ListBox qui présente des objets en utilisant un DataTemplate. Le DataTemplate contient un TextBox. Lorsque l'utilisateur sélectionne un élément dans le contrôle ListBox, je voudrais définir le focus sur le TextBox pour l'élément sélectionné.Comment définir le focus sur un contrôle dans ItemTemplate lorsque ListBoxItem est sélectionné?
J'ai pu partiellement réaliser ceci en manipulant ListBox.SelectionChanged, mais cela fonctionne seulement quand l'utilisateur clique sur le ListBox pour sélectionner l'article - cela ne fonctionne pas si l'utilisateur tabule dans le ListBox et emploie la flèche clés pour sélectionner l'élément même si TextBox.Focus() est invoqué.
Comment puis-je définir le focus sur la zone de texte lorsque l'utilisateur utilise le clavier pour sélectionner un élément?
Voici le balisage pour la zone de liste:
<ListBox Name="lb1" SelectionChanged="ListBox_SelectionChanged" ItemsSource="{Binding Items}" >
<ListBox.ItemTemplate>
<DataTemplate >
<TextBox></TextBox>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
Voici le code de manipulation:
private void ListBox_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
ListBoxItem lbi = (ListBoxItem)this.lb1.ItemContainerGenerator.ContainerFromItem(this.lb1.SelectedItem);
Visual v = GetDescendantByType<TextBox>(lbi);
TextBox tb = (TextBox)v;
tb.Focus();
}
Nice one :) J'espère que cela ne vous dérange pas si j'ajoute une phrase à la réponse expliquant * pourquoi * cela fonctionne. Je dois dire que c'est un peu sale, mais ça fait le travail. –
Wow. Cette ligne était l'épargnant de jour! Merci beaucoup. – Timotei