2010-09-24 4 views
1

Пожалуйста, рассмотрим следующий код XAML:Как получить доступ к Сформирован WPF управления после привязки данных

<ListBox Name="listBox1" ItemsSource="{Binding}" > 
    <ListBox.ItemTemplate> 
     <DataTemplate> 
      <Border Name="border1"> 
       <TextBlock Text="{Binding}" /> 
      </Border> 
     </DataTemplate> 
    </ListBox.ItemTemplate> 
</ListBox> 

и зададим простой массив к нему:

listBox1.DataContext = new[] { "A", "B", "C" }; 

Теперь вопрос в том, как мы можем получить доступ генерируемые объекты для границы (или экземпляры TextBlock)?

  • Нельзя использовать "border1". Этого не существует.
  • listBox1.ItemContainerGenerator.ContainerFromIndex(0) возвращает ListBoxItem, но содержимое этого ListBoxItem имеет тип String.
  • FindName("border1") возвращает нулевое значение

Update: Что я ожидаю найти в экземпляры Border (и 3 TextBlocks, по одному в каждой границе).

ответ

0

Вы можете получить доступ к нему так:

 DataTemplate dt = this.listBox1.ItemTemplate; 
     Border border = dt.LoadContent() as Border; 
     // Do something with border... 
1

После того, как вы получите ListBoxItem, вам необходимо пройти визуальное дерево, чтобы найти то, что ищете.

Dr WPF имеют некоторые большие статьи о нем here

Вот код из этой статьи, чтобы найти потомок определенного типа

public static Visual GetDescendantByType(Visual element, Type type) 
    { 
     if (element.GetType() == type) return element; 

     Visual foundElement = null; 

     if (element is FrameworkElement) 
      (element as FrameworkElement).ApplyTemplate(); 

     for (int i = 0; 
      i < VisualTreeHelper.GetChildrenCount(element); i++) 
     { 
      Visual visual = VisualTreeHelper.GetChild(element, i) as Visual; 
      foundElement = GetDescendantByType(visual, type); 
      if (foundElement != null) 
       break; 
     } 

     return foundElement; 
    } 
+0

Однако, я просто хотел бы отметить доктор WPF также утверждает, что манипулирование визуальным деревом таким образом редко требуется. Есть гораздо больше «правильных» (надежных и/или устойчивых) способов сделать что угодно. –

+0

К сожалению, это не может быть ответом. То, что я ищу, - это «экземпляры» или «Граница», когда они генерируются не тем, который находится внутри ItemTemplate. Здесь я ожидаю найти «3» объекта типа Border (у меня есть 3 элемента в DataContext) –

+0

@shayan: Прогуливаясь по визуальному дереву, вы получите нужные данные экземпляра. Просто используйте listview как Visual и Border как тип. Но, как предложил Алекс, в целом они лучше подходят. Что вы пытаетесь сделать с границей, когда получаете ее? – mdm20

Смежные вопросы