请考虑以下XAML代码:
<ListBox Name="listBox1" ItemsSource="{Binding}" >
<ListBox.ItemTemplate>
<DataTemplate>
<Border Name="border1">
<TextBlock Text="{Binding}" />
</Border>
</DataTemplate>
</ListBox.ItemTemplate>
</ListBox>
我们为它分配一个简单的数组:
listBox1.DataContext = new[] { "A", "B", "C" };
现在的问题是我们如何访问为Border (或TextBlock实例)生成的对象?
listBox1.ItemContainerGenerator.ContainerFromIndex(0)
返回一个ListBoxItem,但该ListBoxItem的内容是String类型。FindName("border1")
返回null 更新:我期望找到的是 3 边框实例(以及3个TextBlocks,每个边框中有一个)。
答案 0 :(得分:2)
获得ListBoxItem后,您需要走可视树以找到您要查找的内容。
WPF博士有一些很棒的文章here
以下是该文章中用于搜索特定类型
的后代的代码 public static Visual GetDescendantByType(Visual element, Type type)
{
if (element.GetType() == type) return element;
Visual foundElement = null;
if (element is FrameworkElement)
(element as FrameworkElement).ApplyTemplate();
for (int i = 0;
i < VisualTreeHelper.GetChildrenCount(element); i++)
{
Visual visual = VisualTreeHelper.GetChild(element, i) as Visual;
foundElement = GetDescendantByType(visual, type);
if (foundElement != null)
break;
}
return foundElement;
}
答案 1 :(得分:0)
你可以像这样访问它:
DataTemplate dt = this.listBox1.ItemTemplate;
Border border = dt.LoadContent() as Border;
// Do something with border...