如何在数据绑定后访问生成的WPF控件

时间:2010-09-24 17:19:31

标签: wpf xaml binding datatemplate

请考虑以下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实例)生成的对象?

  • “border1”无法实现。它不存在。
  • listBox1.ItemContainerGenerator.ContainerFromIndex(0)返回一个ListBoxItem,但该ListBoxItem的内容是String类型。
  • FindName("border1")返回null

更新:我期望找到的是 3 边框实例(以及3个TextBlocks,每个边框中有一个)。

2 个答案:

答案 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...