2009-07-16 8 views
4

J'ai une zone de liste avec des blocs de texte et un bouton - dans le code du bouton derrière elle appelle une méthode passant l'élément de la liste sélectionnée, cela fonctionne très bien. Le problème est que lorsque je sélectionne un élément puis que je clique sur le bouton d'un autre élément, il ne met pas à jour la propriété "SelectedItem" - Y at-il un moyen Xaml ou C# de forcer un clic pour sélectionner le ListBoxItem parent?WPF ListBox Button Élément sélectionné

Xaml

<DataTemplate> 
    <Grid> 
     <Button x:Name="myButton" Click="myButton_Click" Height="30" Width="30"> 
      <Image Source="Resources\Image.png" /> 
     </Button> 
     <TextBlock Text="{Binding DataField}"></TextBlock> 
    </Grid> 
</DataTemplate> 
+0

Donc, il y a un bouton et un TextBlock pour chaque ListBoxItem? Pouvez-vous poster votre XAML ou nous donner une idée un peu meilleure de la façon dont cela est mis en place? – Charlie

Répondre

19
var curItem = ((ListBoxItem)myListBox.ContainerFromElement((Button)sender)).Content; 
+0

Choisissez comme réponse pour la simplicité. – Nate

+0

Cela fonctionne pour une gamme d'éléments d'expéditeur! Utilisé pour l'expéditeur (Grid). – Enrico

+0

grande réponse, n'aurait jamais eu connaissance de la fonction ContainerFromElement – antfx

3

Lorsqu'un bouton est cliqué, il définit e.Handled true, ce qui provoque l'événement routé traversal à arrêter.

Vous pouvez ajouter un gestionnaire au bouton qui soulève de nouveau l'événement routé ou trouve l'ancêtre visuel de type ListBoxItem et définit sa propriété IsSelected sur true.

EDIT

Une méthode d'extension comme ceci:

public static DependencyObject FindVisualAncestor(this DependencyObject wpfObject, Predicate<DependencyObject> condition) 
{ 
    while (wpfObject != null) 
    { 
     if (condition(wpfObject)) 
     { 
      return wpfObject; 
     } 

     wpfObject = VisualTreeHelper.GetParent(wpfObject); 
    } 

    return null; 
} 

Utilisation:

myButton.FindVisualAncestor((o) => o.GetType() == typeof(ListBoxItem)) 
+0

À quoi ressemblerait une méthode comme celle-ci? Comment trouver l'ancêtre visuel du ListBoxItem sur lequel le bouton est activé? – Nate

+1

Édité ma réponse. –