2011-01-13 9 views
3

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(); 
} 

Répondre

6

Une façon de le faire est de remplacer le tb.Focus() de votre gestionnaire d'événements SelectionChanged avec:

tb.Dispatcher.BeginInvoke(DispatcherPriority.Input, new ThreadStart(delegate() 
     { 
      tb.Focus(); 
     })); 

Cela fonctionne parce que vous appelez BeginInvoke sur le répartiteur provoque l'exécution du code spécifié lorsque le répartiteur est disponible, c'est-à-dire après que WPF a terminé de gérer les événements en interne. L'attrape est que, après avoir appuyé sur la flèche vers le bas quand un élément de liste a le focus, l'élément de liste suivant sera sélectionné, sa zone de texte deviendra focalisée et vous ne pourrez plus déplacer la sélection avec la flèche vers le bas. Vous aurez probablement envie d'écrire du code pour gérer ce cas aussi.

+0

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. –

+0

Wow. Cette ligne était l'épargnant de jour! Merci beaucoup. – Timotei

Questions connexes