Gewusst wie: Suchen von Elementen, die mit einer DataTemplate generiert wurden

Aktualisiert: November 2007

Dieses Beispiel zeigt, wie Elemente, die von einer DataTemplate generiert wurden, gesucht werden.

Beispiel

In diesem Beispiel ist ein ListBox an einige XML-Daten gebunden:

<ListBox Name="myListBox" ItemTemplate="{StaticResource myDataTemplate}"
         IsSynchronizedWithCurrentItem="True">
  <ListBox.ItemsSource>
    <Binding Source="{StaticResource InventoryData}" XPath="Books/Book"/>
  </ListBox.ItemsSource>
</ListBox>

Das ListBox verwendet die folgende DataTemplate:

<DataTemplate x:Key="myDataTemplate">
  <TextBlock Name="textBlock" FontSize="14" Foreground="Blue">
    <TextBlock.Text>
      <Binding XPath="Title"/>
    </TextBlock.Text>
  </TextBlock>
</DataTemplate>

Wenn Sie das TextBlock-Element abrufen möchten, das von der DataTemplate von einem bestimmten ListBoxItem generiert wurde, müssen Sie das ListBoxItem ermitteln, das ContentPresenter-Element in diesem ListBoxItem suchen und dann FindName für die DataTemplate aufrufen, die für dieses ContentPresenter-Element festgelegt ist. Das folgende Beispiel zeigt, wie diese Schritte ausgeführt werden. Zu Demonstrationszwecken wird im folgenden Beispiel ein Meldungsfeld erstellt, mit dem der Textinhalt des mit der DataTemplate generierten Textblocks angezeigt wird.

// Getting the currently selected ListBoxItem
// Note that the ListBox must have
// IsSynchronizedWithCurrentItem set to True for this to work
ListBoxItem myListBoxItem =
    (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));

// Getting the ContentPresenter of myListBoxItem
ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);

// Finding textBlock from the DataTemplate that is set on that ContentPresenter
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);

// Do something to the DataTemplate-generated TextBlock
MessageBox.Show("The text of the TextBlock of the selected list item: "
    + myTextBlock.Text);

Es folgt die Implementierung von FindVisualChild, die die VisualTreeHelper-Methoden verwendet:

private childItem FindVisualChild<childItem>(DependencyObject obj)
    where childItem : DependencyObject
{
    for (int i = 0; i < VisualTreeHelper.GetChildrenCount(obj); i++)
    {
        DependencyObject child = VisualTreeHelper.GetChild(obj, i);
        if (child != null && child is childItem)
            return (childItem)child;
        else
        {
            childItem childOfChild = FindVisualChild<childItem>(child);
            if (childOfChild != null)
                return childOfChild;
        }
    }
    return null;
}

Das vollständige Beispiel finden Sie unter Beispiel zum Suchen von mit Vorlagen erstellten Elementen.

Siehe auch

Aufgaben

Gewusst wie: Suchen von Elementen, die mit einer ControlTemplate generiert wurden

Konzepte

Übersicht über Datenbindung

Erstellen von Formaten und Vorlagen

WPF-Namescopes

Strukturen in WPF

Weitere Ressourcen

Beispiel zur Datenbindung

Gewusst-wie-Themen zur Datenbindung