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