كيفية القيام بما يلي: البحث عن عناصر منشأة من DataTemplate

يوضح هذا المثال كيفية البحث عن العناصر التي تم إنشاؤها بواسطة DataTemplate.

مثال

في هذا المثال، هناك ListBox الذي يرتبط ببعض XML البيانات:

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

The 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
            Dim myListBoxItem As ListBoxItem = CType(myListBox.ItemContainerGenerator.ContainerFromItem(myListBox.Items.CurrentItem), ListBoxItem)

            ' Getting the ContentPresenter of myListBoxItem
            Dim myContentPresenter As ContentPresenter = FindVisualChild(Of ContentPresenter)(myListBoxItem)

            ' Finding textBlock from the DataTemplate that is set on that ContentPresenter
            Dim myDataTemplate As DataTemplate = myContentPresenter.ContentTemplate
            Dim myTextBlock As TextBlock = CType(myDataTemplate.FindName("textBlock", myContentPresenter), TextBlock)

            ' Do something to the DataTemplate-generated TextBlock
            MessageBox.Show("The text of the TextBlock of the selected list item: " & myTextBlock.Text)
// 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 Function FindVisualChild(Of childItem As DependencyObject)(ByVal obj As DependencyObject) As childItem
            For i As Integer = 0 To VisualTreeHelper.GetChildrenCount(obj) - 1
                Dim child As DependencyObject = VisualTreeHelper.GetChild(obj, i)
                If child IsNot Nothing AndAlso TypeOf child Is childItem Then
                    Return CType(child, childItem)
                Else
                    Dim childOfChild As childItem = FindVisualChild(Of childItem)(child)
                    If childOfChild IsNot Nothing Then
                        Return childOfChild
                    End If
                End If
            Next i
            Return Nothing
        End Function
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 XAML Namescopes

الأشجار فى الWPF

موارد أخرى

المواضيع الإجرائية لربط البيانات