2009-07-16 19 views
4

Ich habe eine Listbox mit einigen Textblöcken und einer Schaltfläche - in der Codehind der Schaltfläche ruft eine Methode die Übergabe des aktuell ausgewählten Listenfeldelements auf, das funktioniert super. Das Problem ist, dass, wenn ich ein Element auswähle und dann auf die Schaltfläche eines anderen Elements klicke, die Eigenschaft "SelectedItem" nicht aktualisiert wird - gibt es einen Weg Xaml oder C#, dass ich einen Knopfklick erzwingen kann, um das übergeordnete ListBoxItem auszuwählen?WPF ListBox Button Ausgewähltes Element

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

So gibt es einen Knopf und ein Textblock für jede ListBoxItem? Kannst du dein XAML posten oder uns eine etwas bessere Idee geben, wie das eingerichtet ist? – Charlie

Antwort

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

Wählen Sie als Antwort die Einfachheit. – Nate

+0

Dies funktioniert für eine Reihe von Absenderelementen! Benutzte es für (Grid) Sender. – Enrico

+0

große Antwort, hätte nie von der ContainerFromElement-Funktion gewusst – antfx

3

Wenn eine Schaltfläche geklickt wird, setzt es e.Handled auf true, wodurch das Routingereignis Traversal Einhalt zu gebieten.

Sie könnten dem Button einen Handler hinzufügen, der das Routingereignis erneut auslöst oder den visuellen Vorgänger vom Typ ListBoxItem findet und seine IsSelected-Eigenschaft auf true setzt.

EDIT

Eine Erweiterung Methode wie folgt:

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

     wpfObject = VisualTreeHelper.GetParent(wpfObject); 
    } 

    return null; 
} 

Verbrauch:

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

Wie würde eine solche Methode aussehen? Wie würde ich den visuellen Vorfahren des ListBoxItems finden, auf dem die Schaltfläche aktiviert ist? – Nate

+1

Redigierte meine Antwort. –

Verwandte Themen