WPF: Auf welchem ListBoxItem befinde ich mich, wenn ich auf ein darin enthaltenes UserControl klicke?

Dazu gebe ich mal hier die Problemlösung wieder, die ich in einem Forum einem Fragenden bereits vorgestellt habe. Den Lösungsansatz kann man sicherlich des Öfteren einsetzen. Ein DataTemplate, das ein UserControl beinhaltet, wurde definiert:

<ListBox x:Name="myList">
  <ListBox.ItemTemplate>
    <DataTemplate>
      <controls: myUserControl />
    </DataTemplate>
  </ListBox.ItemTemplate>
...
</ListBox>

Tja, wie kommt man nun auf das darunterliegende ListBoxItem, wenn der Anwender auf das UserControl klickt?
Lösung:
Man muss von dem UserControl aus den VisualTree abklappern, bis man auf das darunterliegende ListBoxItem stösst. Dazu habe ich hier eine allgemeine Hilfsmethode implementiert, die man auch für andere Fälle (z.B. ein ListView Control) verwenden kann. Die Methode GetNextVisualParentOfType() liefert das erste Vorkommen eines DependencyObjects des angegebenen Typs im VisualTree:

private DependencyObject GetNextVisualParentOfType(
  DependencyObject startObject, Type type)
{
  DependencyObject parent = startObject;
  while (parent != null)
  {
    if (type.IsInstanceOfType(parent))
      break;
    else
      parent = VisualTreeHelper.GetParent(parent);
  }
  return parent;
}

Der Aufruf im Click-Handler des UserControls könnte dann so aussehen:

ListBoxItem currentListBoxItem = GetNextVisualParentOfType(myUserControl, typeof(ListBoxItem)) as ListBoxItem;

Das könnte dich auch interessieren …