Comment : rechercher des éléments générés par DataTemplate

Mise à jour : novembre 2007

Cet exemple montre comment rechercher des éléments qui sont générés par DataTemplate.

Exemple

Dans cet exemple, ListBox est lié à des données XML.

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

ListBox utilise le DataTemplate suivant :

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

Si vous souhaitez retrouver l'élément TextBlock généré par le DataTemplate d'un certain ListBoxItem, vous devez obtenir le ListBoxItem, trouver le ContentPresenter dans ce ListBoxItem, puis appeler FindName sur le DataTemplate qui est défini sur ce ContentPresenter. L'exemple suivant montre comment exécuter ces étapes. À des fins de démonstration, cette exemple crée un message qui affiche le contenu du bloc de texte généré par DataTemplate.

// 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);

L'exemple suivant illustre l'implémentation de FindVisualChild, qui utilise les méthodes VisualTreeHelper :

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;
}

Pour l'exemple complet, consultez Recherche des éléments générés à partir de modèles, exemple.

Voir aussi

Tâches

Rechercher des éléments générés par ControlTemplate

Concepts

Vue d'ensemble de la liaison de données

Application d'un style et création de modèles

Portées de nom WPF

Arborescences dans WPF

Autres ressources

Exemples de liaisons de données

Rubriques Comment relatives aux liaisons de données