Procedura: trovare elementi generati da un oggetto DataTemplate
Aggiornamento: novembre 2007
In questo esempio viene illustrata la procedura per la ricerca di elementi generati da un oggetto DataTemplate.
Esempio
Nell'esempio, è presente un oggetto ListBox associato ad alcuni dati XML:
<ListBox Name="myListBox" ItemTemplate="{StaticResource myDataTemplate}"
IsSynchronizedWithCurrentItem="True">
<ListBox.ItemsSource>
<Binding Source="{StaticResource InventoryData}" XPath="Books/Book"/>
</ListBox.ItemsSource>
</ListBox>
ListBox utilizza il seguente oggetto DataTemplate:
<DataTemplate x:Key="myDataTemplate">
<TextBlock Name="textBlock" FontSize="14" Foreground="Blue">
<TextBlock.Text>
<Binding XPath="Title"/>
</TextBlock.Text>
</TextBlock>
</DataTemplate>
Per recuperare l'elemento TextBlock generato dall'oggetto DataTemplate di un determinato oggetto ListBoxItem, è necessario ottenere l'oggetto ListBoxItem, trovare ContentPresenter all'interno dello stesso oggetto ListBoxItem e chiamare FindName sull'oggetto DataTemplate impostato su tale ContentPresenter. Nell'esempio riportato di seguito viene illustrata la modalità di esecuzione di questa procedura. Viene creata, a scopo dimostrativo, una finestra di messaggio in cui è visualizzato il contenuto di testo del blocco di testo generato da 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);
Di seguito viene mostrata l'implementazione di FindVisualChild, che utilizza i metodi 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;
}
Per l'esempio completo, vedere Esempio di ricerca di elementi generati da un modello.
Vedere anche
Attività
Procedura: trovare elementi generati da un oggetto ControlTemplate
Concetti
Cenni preliminari sull'associazione dati
Applicazione di stili e modelli