Windows Phone,ItemsControl.ContainerFromIndex返回null

时间:2014-11-09 20:31:01

标签: wpf xaml windows-phone-8.1 itemscontrol

我有一个模板控制。模板的一部分如下所示:

<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
    }                    
}

在校准icSubObjects.ContainerFromIndex(i)之后,我总是得到null,尽管事实上,对象被正确显示并且icSubObjects.Items.Count大于0.我该怎么做才能使这个方法正常工作? (或者我做错了什么?)


编辑:情节展开

我在互联网上发现了一个解决问题的技巧。诀窍是“触摸”其中一个容器的Children属性,该容器包含ItemsControl控件:

var temp = gContainer.Children;

然后正确填充容器。

我有另一个问题。从ContainerFromIndex开始,我获得了ContentPresenter。如何访问位于StateButton的{​​{1}}内的DataTemplate

1 个答案:

答案 0 :(得分:0)

通过阅读问题下方的评论,我知道您已经知道为什么btn始终为空(尽管我猜它甚至没有输入if语句)。无论如何,我会再次为想要了解的人说出来。

ContainerFromIndex 会返回ContentPresenter (大多数情况下)。 不是StateButton

现在,要从ContentPresenter获取您想要的StateButton,我认为您可以这样做:

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

如果这不起作用(即,StateButton不是ContentPresenter的唯一和第一个子节点),只需检查可视树并修改代码以从树中获取所需的元素。