zoukankan      html  css  js  c++  java
  • 如何:查找由 DataTemplate 生成的元素

    http://msdn.microsoft.com/zh-cn/library/bb613579.aspx

    下面的示例演示如何查找由 DataTemplate 生成的元素。

    在本示例中,有一个绑定到某些 XML 数据的 ListBox

    <ListBox Name="myListBox" ItemTemplate="{StaticResource myDataTemplate}"
             IsSynchronizedWithCurrentItem="True">
      <ListBox.ItemsSource>
        <Binding Source="{StaticResource InventoryData}" XPath="Books/Book"/>
      </ListBox.ItemsSource>
    </ListBox>
    
    
    

    ListBox 使用以下 DataTemplate

    <DataTemplate x:Key="myDataTemplate">
      <TextBlock Name="textBlock" FontSize="14" Foreground="Blue">
        <TextBlock.Text>
          <Binding XPath="Title"/>
        </TextBlock.Text>
      </TextBlock>
    </DataTemplate>
    
    
    

    如果要检索由某个 ListBoxItemDataTemplate 生成的 TextBlock 元素,您需要获得 ListBoxItem,在该 ListBoxItem 内查找 ContentPresenter,然后对在该 ContentPresenter 上设置的 DataTemplate 调用 FindName 下面的示例演示如何执行这些步骤。 出于演示的目的,本示例创建一个消息框,用于显示由 DataTemplate 生成的文本块的文本内容。

    // Getting the currently selected ListBoxItem
    // Note that the ListBox must have
    // IsSynchronizedWithCurrentItem set to True for this to work
    ListBoxItem myListBoxItem =
        (ListBoxItem)(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem));
    
    // Getting the ContentPresenter of myListBoxItem
    ContentPresenter myContentPresenter = FindVisualChild<ContentPresenter>(myListBoxItem);
    
    // Finding textBlock from the DataTemplate that is set on that ContentPresenter
    DataTemplate myDataTemplate = myContentPresenter.ContentTemplate;
    TextBlock myTextBlock = (TextBlock)myDataTemplate.FindName("textBlock", myContentPresenter);
    
    // Do something to the DataTemplate-generated TextBlock
    MessageBox.Show("The text of the TextBlock of the selected list item: "
        + myTextBlock.Text);
    
    
    

    下面是 FindVisualChild 的实现,使用的是 VisualTreeHelper 方法:

    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;
    }
    
    
    
  • 相关阅读:
    修改注释的风格
    PHP in_array
    PHP end
    PHP each
    GitHub和SourceTree入门教程
    面试题解析(不定时更新)
    Container With Most Water
    Minimum Path Sum
    Generate Parentheses
    Unique Paths
  • 原文地址:https://www.cnblogs.com/zziss/p/2734952.html
Copyright © 2011-2022 走看看