다음을 통해 공유


방법: DataTemplate에서 생성된 요소 찾기

업데이트: 2007년 11월

이 예제에서는 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);

다음은 VisualTreeHelper 메서드를 사용하는 FindVisualChild를 구현한 것입니다.

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에서 생성된 요소 찾기

개념

데이터 바인딩 개요

스타일 지정 및 템플릿

WPF 이름 범위

WPF의 트리

기타 리소스

데이터 바인딩 샘플

데이터 바인딩 방법 항목