2009-07-07 91 views
4

我正在創建一個名爲FooControl的派生自ItemsControl的自定義控件,它在theme \ generic.xaml中定義了相同的默認樣式。如何從ItemsControl派生的自定義控件中訪問ItemsHost

FooControl的默認樣式將ItemsPanel屬性設置爲另一個名爲FooPanel的自定義面板,如下所示(我不認爲自定義面板的用法對此問題很重要)。

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

在我的FooControl後面的代碼中,我想訪問自動創建的FooPanel實例。通過查看反射器,我發現ItemsControl確實有一個名爲ItemsHost的屬性,但我無法從FooControl訪問它,因爲ItemsHost是內部的

有人可能會建議我一個可靠的方法來獲取對FooPanel實例的引用嗎?

回答

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

0

您可以使用VisualTreeHelper.GetChild(...)。我相信它應該是ItemsControl子類的第一個或第二個子元素。

相關問題