2013-06-07 1 views
1

j'ai ListView suivant (simplifié):Réglage SelectedItem en ListView lorsque l'utilisateur clique dans ItemTemplate Textbox

<ListView Name="lvwNotes" KeyUp="lvwNotes_KeyUp"> 
    <ListView.ItemTemplate> 
     <DataTemplate> 
      <StackPanel Orientation="Vertical"> 
       <DockPanel Background="LightGray"> 
        <TextBlock DockPanel.Dock="Right" Text="{Binding Path=Author}" /> 
        <TextBlock Text="{Binding Path=Timestamp}" /> 
       </DockPanel> 
       <TextBox Text="{Binding Path=Text}" 
         GotFocus = "lvwNotes_TextBox_GotFocus" 
         TextWrapping="Wrap" /> 
      </StackPanel> 
     </DataTemplate> 
    </ListView.ItemTemplate> 

Changer l'élément sélectionné par un clic ne fonctionne que lorsque l'utilisateur clique sur le DockPanel avec TextBlocks, mais pas en cliquant sur le TextBox. Ce que je veux réaliser est de placer l'article choisi à celui qui contient le TextBox dans lequel l'utilisateur a cliqué.

je réussi à passer au ListViewItem en rapport avec la zone de texte:

private void lvwNotes_TextBox_GotFocus(object sender, RoutedEventArgs e) { 
    DependencyObject o = Tools.GetAncestorByType((DependencyObject)sender, typeof(ListViewItem)); 
    if (!o.Equals(null)) { 
     // code to select this ListViewItem 
    } 
} 

Mais la mise en

lvwNotes.SelectedIten = o ; 

reste sans effet. J'ai aussi essayé quelques trucs avec Dispatcher.BeginInvoke, mais pour être honnête, je ne sais pas exactement ce que je fais là.

Répondre

6

Ajouter à votre code de

<ListView.Resources> 
    <Style TargetType="ListViewItem"> 
     <Style.Triggers> 
      <Trigger Property="IsKeyboardFocusWithin" Value="True"> 
       <Setter Property="IsSelected" Value="True" /> 
      </Trigger> 
     </Style.Triggers> 
    </Style> 
</ListView.Resources> 
+0

Vous pouvez même supprimer le gestionnaire d'événements pour GotFocus. – Nishant

+0

Fonctionne parfaitement. Merci. –

2

Le DataContext moins explicitement changé dans la DataTemplate est l'élément en cours, d'où:

private void lvwNotes_TextBox_GotFocus(object sender, RoutedEventArgs e) 
{ 
    var tb = (TextBox)sender; 
    lvwNotes.SelectedItem = tb.DataContext; 
} 
Questions connexes