有一个Listbox,里面的Item是通过数据模板生成的,如下所示:
<
Border
Margin
="15"
BorderBrush
="Aqua"
BorderThickness
="2"
Padding
="8"
CornerRadius
="5"
>
< StackPanel >
< ListBox Name ="myListBox" ItemTemplate ="{StaticResource myDataTemplate}"
IsSynchronizedWithCurrentItem ="True" >
< ListBox.ItemsSource >
< Binding Source ="{StaticResource InventoryData}" XPath ="Books/Book" />
</ ListBox.ItemsSource >
</ ListBox >
< Button Margin ="10"
Click ="DataTemplateFindElement" > Get text of textBlock in DataTemplate </ Button >
</ StackPanel >
</ Border >
< StackPanel >
< ListBox Name ="myListBox" ItemTemplate ="{StaticResource myDataTemplate}"
IsSynchronizedWithCurrentItem ="True" >
< ListBox.ItemsSource >
< Binding Source ="{StaticResource InventoryData}" XPath ="Books/Book" />
</ ListBox.ItemsSource >
</ ListBox >
< Button Margin ="10"
Click ="DataTemplateFindElement" > Get text of textBlock in DataTemplate </ Button >
</ StackPanel >
</ Border >
Listbox使用的数据模板如下:
<
DataTemplate
x:Key
="myDataTemplate"
>
< TextBlock Name ="textBlock" FontSize ="14" >
< TextBlock.Text >
< Binding XPath ="Title" />
</ TextBlock.Text >
</ TextBlock >
</ DataTemplate >
使用下面的代码就可以获取数据模板里面TextBlock中的内容了。
< TextBlock Name ="textBlock" FontSize ="14" >
< TextBlock.Text >
< Binding XPath ="Title" />
</ TextBlock.Text >
</ TextBlock >
</ DataTemplate >
ListBoxItem myListBoxItem
=
(ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));
ContentPresenter myContentPresenter = FindVisualChild < ContentPresenter > (myListBoxItem);
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName( " textBlock " , myContentPresenter);
MessageBox.Show( " The text of the named TextBlock in the DataTemplate of the selected list item: " + myTextBlock.Text);
ContentPresenter myContentPresenter = FindVisualChild < ContentPresenter > (myListBoxItem);
DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName( " textBlock " , myContentPresenter);
MessageBox.Show( " The text of the named TextBlock in the DataTemplate of the selected list item: " + myTextBlock.Text);
上面代码调用的函数如下:
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;
}
{
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;
}