相关:上一个问题 assigning different click handlers to a global control template
我有以下xaml:
<Expander Name="SharesExpander" Template="{StaticResource SimpleExpanderTemp}" Header="Shares">
<ItemsControl Name="SharesControl" ItemsSource="{Binding Sharers}">
<ItemsControl.ItemTemplate>
<DataTemplate>
<Expander Name="ShareExpander" Template="{StaticResource SimpleExpanderTemp}" Header="{Binding Name}">
<local:FileTypesListBoxControl Margin="25,-10,-10,-10" BorderThickness="10" />
</Expander>
</DataTemplate>
</ItemsControl.ItemTemplate>
</ItemsControl>
</Expander>
我试图通过后面的代码访问内部扩展器的标题按钮以添加单击处理程序。
我可以使用SharesExpander.Template.FindName("ExpanderHeader", SharesExpander)
检索外部扩展器的按钮,但我无法弄清楚如何获取数据模板中的内部扩展器。我试过遍历VisualTree
和LogicalTree
,但我似乎总是回到外部扩展器。我可以检索外部扩展器数据模板,我可以在其上调用FindName
,但无法确定要用作第二个参数的元素。救命啊!
一次尝试:
foreach (var item in SharesControl.Items)
{
//test is always null
var test = SharesControl.ItemContainerGenerator.ContainerFromItem(item);
}
另一次尝试:
ControlTemplate controlTemplate = SharesControl.Template;
var control = controlTemplate.FindName("ShareExpander", ?whatGoesHere);
再次:
for (int i = 0; i < 1; i++)
{
//test again always null
var test = ContactSharesItemsControl.ItemContainerGenerator.ContainerFromIndex(i) as Expander;
}