Show / Hide Table of Contents

Практическое руководство. Поиск элементов, созданных с использованием шаблона DataTemplate

В этом примере показано, как для поиска элементов, создаваемых DataTemplate.

Пример

В этом примере имеется ListBox , привязанный к некоторым XML данных:

<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>

Если вы хотите получить TextBlock элемент, созданный DataTemplate определенного ListBoxItem, необходимо получить ListBoxItem, найти ContentPresenter внутри этого ListBoxItem, а затем вызвать FindName на DataTemplate установленное, ContentPresenter. В следующем примере показано, как для выполнения этих шагов. В демонстрационных целях в этом примере создается окно сообщения, которое будет отображен текст содержимого из 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;
}

См. также

  • Практическое руководство. Поиск элемента, созданного шаблоном ControlTemplate
  • Общие сведения о привязке данных
  • Практические руководства
  • Стилизация и использование шаблонов
  • Области видимости имен XAML в WPF
  • Деревья в WPF
Back to top Неофициальная документация по .NET на русском языке. Лицензия: CC-BY 4.0. Основано на документации по .NET с Microsoft Docs
Generated by DocFX