如何从ItemsControl派生的自定义控件访问ItemsHost

时间:2009-07-07 12:35:51

标签: silverlight-3.0 silverlight-2.0

我正在创建一个名为FooControl的自定义控件,派生自ItemsControl,在themes \ 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的实例吗?

2 个答案:

答案 0 :(得分:1)

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

如前一篇文章中所建议的那样使用VisualTreeHelper.GetChild()可能会有效,但如果items控件的重新设置会导致items面板进一步嵌套,那么它将会中断。

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

Panel itemsPanel;

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

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

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

答案 1 :(得分:0)

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