我有一个模板控制。模板的一部分如下所示:
<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
?
答案 0 :(得分:0)
通过阅读问题下方的评论,我知道您已经知道为什么btn
始终为空(尽管我猜它甚至没有输入if
语句)。无论如何,我会再次为想要了解的人说出来。
ContainerFromIndex
会返回ContentPresenter (大多数情况下)。 不是StateButton 。
现在,要从ContentPresenter获取您想要的StateButton
,我认为您可以这样做:
var btn = (StateButton)VisualTreeHelper.GetChild(contentPresenter, 0);
如果这不起作用(即,StateButton不是ContentPresenter的唯一和第一个子节点),只需检查可视树并修改代码以从树中获取所需的元素。