有一个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
>
Listbox使用的数据模板如下:
<
DataTemplate
x:Key
="myDataTemplate"
>
<
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);
上面代码调用的函数如下:
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;
}
本文介绍如何在WPF中通过编程方式与ListBox的数据模板进行交互,具体演示了如何从选中的ListBox项中找到并获取数据模板内的TextBlock文本。
1712

被折叠的 条评论
为什么被折叠?



