Frage

Ich habe ein ListBox Daten gebunden an die Sammlung meiner PersonCollection Klasse. Als nächstes habe ich eine Datenvorlage für Objekte vom Typ Person definiert habe, bestand aus einem DockPanel, die eine TextBlock für den Namen einer Person und ein Button enthält die Person aus der Liste zu entfernen. Es sieht alles zusammen sehr schön.

Das Problem, das ich bin vor ist, dass ich nicht in der Lage bin das ausgewählte Element zu erreichen (und löscht) in der Liste, wenn ich die Taste in der Datenvorlage definiert klicken. Hier ist der Handler des Buttons an:

private void RemovePersonButton_Click(object sender, RoutedEventArgs e)
{
    Button clickedButton = (Button)e.Source;
    DockPanel buttonPanel = (DockPanel)clickedButton.Parent;
    Control control = (Control)button.Parent;
}

Das letzte erstellte Objekt control ist null, das heißt ich nicht weiter oben in der Elementstruktur fortschreiten kann, so dass ich nicht die Liste und ihre SelectedItem erreichen kann. Wichtig ist hier zu beachten ist, dass kann einfach nicht gehen mit dem ausgewählten Eintrag aus der Liste bekommen, indem sie es nennt, weil ich mehr als eine Liste im Fenster habe und all diese Listen die gleiche Datenvorlage implementieren, dh den gleichen Ereignishandler für die gemeinsam nutzen Schaltfläche löschen.

Ich würde schätzen alle Hilfe, die ich bekommen konnte. Vielen Dank.

War es hilfreich?

Lösung

Wenn ich die Frage richtig verstanden habe ich glaube, Sie werden in der Lage sein, die Person vom Button Datacontext zu bekommen

private void RemovePersonButton_Click(object sender, RoutedEventArgs e) 
{
    Button clickedButton = (Button)e.Source; 
    Person selectedItem = clickedButton.DataContext as Person;
    if (selectedItem != null)
    {
        PersonCollection.Remove(selectedItem);
    }
}

Eine andere Möglichkeit ist es, die List-Box in der VisualTree

zu finden
private void RemovePersonButton_Click(object sender, RoutedEventArgs e) 
{
    Button clickedButton = (Button)e.Source; 
    ListBox listBoxParent = GetVisualParent<ListBox>(clickedButton );
    Person selectedItem = listBoxParent.SelectedItem as Person;
    //...
}

public T GetVisualParent<T>(object childObject) where T : Visual
{
    DependencyObject child = childObject as DependencyObject;
    while ((child != null) && !(child is T))
    {
        child = VisualTreeHelper.GetParent(child);
    }
    return child as T;
}

Andere Tipps

Sie könnten versuchen, mit VisualTreeHelper.GetParent die visuelle Struktur zu gehen, anstatt sich auf die Logik Eltern angewiesen zu sein.

sagte, dass, sollten Sie überlegen, ob Sie Ihre Person in einer PersonItem Klasse wickeln können, mit zusätzlichen Kontextinformationen, so dass der PersonItem weiß, wie die Person aus der Liste zu entfernen. Ich werde manchmal dieses Muster verwenden und ich eine EncapsulatingCollection Klasse schrieb, dass automatisch Instantiiert Wrapper auf die Veränderungen in einem überwachten ObservableCollection basierte Objekte.

Lizenziert unter: CC-BY-SA mit Zuschreibung
Nicht verbunden mit StackOverflow
scroll top