2014-11-09 2 views
0

У меня есть шаблонный контроль. Часть шаблона выглядит так:Windows Phone, ItemsControl.ContainerFromIndex возвращает null

<ItemsControl x:Name="icSubObjects"> 
    <ItemsControl.ItemsPanel> 
     <ItemsPanelTemplate> 
      <StackPanel Orientation="Horizontal" /> 
     </ItemsPanelTemplate> 
    </ItemsControl.ItemsPanel> 
    <ItemsControl.ItemTemplate> 
     <DataTemplate> 
      <local:StateButton Content="{Binding}" /> 
     </DataTemplate> 
    </ItemsControl.ItemTemplate> 
</ItemsControl> 

ItemsSource для этой панели устанавливается из кода позади.

Затем в коде я пытаюсь получить доступ фактические объекты, сгенерированные из данных:

for (int i = 0; i < icSubObjects.Items.Count; i++) 
{ 
    var element = icSubObjects.ContainerFromIndex(i); 
    if (element is StateButton) 
    { 
     var btn = element as StateButton; 

     // btn is always null, despite icSubObjects.Items.Count being > 0 
    }      
} 

После caling icSubObjects.ContainerFromIndex(i), я всегда получаю нулевой, несмотря на факт, что объекты будут корректно отображаться и icSubObjects.Items.Count больше 0 Что я могу сделать, чтобы этот метод работал правильно? (Или то, что я делаю неправильно?)


Edit: Сюжет разворачивается

я нашел в Интернете трюк, который фиксирует проблему. Хитрость заключается в том, чтобы «прикоснуться» Children свойство одного из контейнеров, который содержит элемент управления ItemsControl:

var temp = gContainer.Children; 

контейнеры затем заполняется правильно.

У меня есть еще одна проблема. От ContainerFromIndex Я получаю ContentPresenter. Как я могу получить доступ к StateButton, который находится внутри DataTemplate этого ContentPresenter?

+0

@Clemens Вы на самом деле пытались ответить на мой следующий вопрос, о котором я еще не спрашивал :) Моя проблема была решена - как-то найденная в Интернете - «касаясь» свойства «Дети» контейнера, на котором 'ItemsControl 'размещен. Теперь я получаю эти 'ContentPresenter', но отличное свойство' Content' для 'StateButton' возвращает null. Похоже, что 'Content'' ContentPresenter' - это просто строка. Есть идеи? – Spook

+0

Извините, но я был не на том пути. StateButton * не * помещается в свойство Content. В WPF вы получите его, называя его в XAML (путем установки, например, 'x: Name =" sb "', а затем вызывая 'element.ContentTemplate.FindName (" sb ", element)' (где element является ContentPresenter). Не уверен, что это будет работать в Windows Phone. – Clemens

ответ

0

Из-за того, что читаю комментарии ниже вопроса, я понимаю, что вы уже знаете, почему btn всегда имеет значение null (хотя, я думаю, он даже не вводит этот оператор if). Во всяком случае, я скажу это снова для всех, кто хочет знать.

ContainerFromIndexвозвращает ContentPresenter (в большинстве случаев). Not StateButton.

Теперь, чтобы получить StateButton, что вы хотите от ContentPresenter, я думаю, что вы можете сделать это:

var btn = (StateButton)VisualTreeHelper.GetChild(contentPresenter, 0); 

Если это не работает (то есть, StateButton не единственный и первый child из ContentPresenter), просто проверьте дерево визуализации и измените код, чтобы получить необходимый элемент из дерева.

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