4

我正在创建一个名为 FooControl 的自定义控件,它从 ItemsControl 派生,在主题\generic.xaml 中定义了相同的默认样式。

FooControl 的默认样式将 ItemsPanel 属性设置为另一个名为 FooPanel 的自定义面板,如下所示(我认为自定义面板的使用对于这个问题并不重要)。

<Setter Property="ItemsPanel">
  <Setter.Value>
    <ItemsPanelTemplate>
      <local:FooPanel IsItemsHost="True"/>
    </ItemsPanelTemplate>
  </Setter.Value>
</Setter>

在我的 FooControl 背后的代码中,我想访问自动创建的 FooPanel 实例。通过查看反射器,我发现 ItemsControl 确实有一个名为 ItemsHost 的属性,但我无法从 FooControl 访问它,因为 ItemsHost 是内部的

有人可以建议我一种可靠的方法来获取对 FooPanel 实例的引用吗?

4

2 回答 2

1

不幸的是,ItemsControl 控件没有公开对此元素的引用(事实上,我感觉 ItemsControl 甚至无法访问它本身)。

按照上一篇文章中的建议使用 VisualTreeHelper.GetChild() 可能会起作用,但如果重新设置项目控件的样式,导致项目面板确实嵌套得更深,它将中断。

获取引用的一种稍微不那么脆弱(但仍远非完美)的方法是获取第一个孩子的容器的父级(假设您的项目控件至少包含一个项目)

Panel itemsPanel;

if (Items.Count == 0)
{
   itemsPanel = null;
}
else
{
   var firstContainer = ItemContainerGenerator.ContainerFromIndex(0);

   itemsPanel = VisualTreeHelper.GetParent(firstContainer) as Panel;
}

注意:这仅适用于 SL3 及更高版本,因为它使用 ItemContainerGenerator 属性(我相信 SL2 可能存在解决方法)

于 2009-12-17T16:59:55.893 回答
0

您可以使用 VisualTreeHelper.GetChild(...)。我相信它应该是您的 ItemsControl 子类的第一个或第二个孩子。

于 2009-08-29T03:17:32.710 回答