У меня есть шаблонный контроль. Часть шаблона выглядит так: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
?
@Clemens Вы на самом деле пытались ответить на мой следующий вопрос, о котором я еще не спрашивал :) Моя проблема была решена - как-то найденная в Интернете - «касаясь» свойства «Дети» контейнера, на котором 'ItemsControl 'размещен. Теперь я получаю эти 'ContentPresenter', но отличное свойство' Content' для 'StateButton' возвращает null. Похоже, что 'Content'' ContentPresenter' - это просто строка. Есть идеи? – Spook
Извините, но я был не на том пути. StateButton * не * помещается в свойство Content. В WPF вы получите его, называя его в XAML (путем установки, например, 'x: Name =" sb "', а затем вызывая 'element.ContentTemplate.FindName (" sb ", element)' (где element является ContentPresenter). Не уверен, что это будет работать в Windows Phone. – Clemens