【问题标题】:How to access ItemsHost from a ItemsControl derived custom control如何从 ItemsControl 派生的自定义控件访问 ItemsHost
【发布时间】:2009-07-07 12:35:51
【问题描述】:

我正在创建一个名为 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 实例的引用吗?

【问题讨论】:

    标签: silverlight-3.0 silverlight-2.0


    【解决方案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 可能存在解决方法)

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        猜你喜欢
        • 1970-01-01
        • 2011-07-12
        • 1970-01-01
        • 2011-06-30
        • 1970-01-01
        • 2012-08-17
        • 2011-04-04
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多