有一个Listbox,里面的Item是通过数据模板生成的,如下所示:

WPF中如何使用代码操作数据模板生成的控件-LMLPHP<Border Margin="15" BorderBrush="Aqua" BorderThickness="2" Padding="8" CornerRadius="5">WPF中如何使用代码操作数据模板生成的控件-LMLPHP
WPF中如何使用代码操作数据模板生成的控件-LMLPHP      <StackPanel>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP        <ListBox Name="myListBox" ItemTemplate="{StaticResource myDataTemplate}"
WPF中如何使用代码操作数据模板生成的控件-LMLPHP                 IsSynchronizedWithCurrentItem="True">
WPF中如何使用代码操作数据模板生成的控件-LMLPHP          <ListBox.ItemsSource>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP            <Binding Source="{StaticResource InventoryData}" XPath="Books/Book"/>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP          </ListBox.ItemsSource>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP        </ListBox>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP        <Button Margin="10"
WPF中如何使用代码操作数据模板生成的控件-LMLPHP                Click="DataTemplateFindElement">Get text of textBlock in DataTemplate</Button>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP      </StackPanel>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP    </Border>

Listbox使用的数据模板如下:

WPF中如何使用代码操作数据模板生成的控件-LMLPHP<DataTemplate x:Key="myDataTemplate">
WPF中如何使用代码操作数据模板生成的控件-LMLPHP      <TextBlock Name="textBlock" FontSize="14">
WPF中如何使用代码操作数据模板生成的控件-LMLPHP        <TextBlock.Text>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP          <Binding XPath="Title"/>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP        </TextBlock.Text>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP      </TextBlock>
WPF中如何使用代码操作数据模板生成的控件-LMLPHP    </DataTemplate>

使用下面的代码就可以获取数据模板里面TextBlock中的内容了。

WPF中如何使用代码操作数据模板生成的控件-LMLPHPListBoxItem myListBoxItem = (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));
WPF中如何使用代码操作数据模板生成的控件-LMLPHPContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);
WPF中如何使用代码操作数据模板生成的控件-LMLPHPDataTemplate myDataTemplate = myContentPresenter.ContentTemplate;    
  TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);
WPF中如何使用代码操作数据模板生成的控件-LMLPHPMessageBox.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;
    }

04-19 16:57