2009-07-07 8 views
4

ItemsControlから派生したFooControlというカスタムコントロールを作成していますが、themes \ generic.xamlで同じものに対して定義されているデフォルトスタイルがあります。ItemsControlから派生したカスタムコントロールからのアイテムホスト

FooControlのデフォルトのスタイルでは、ItemsPanelプロパティをFooPanelという別のカスタムパネルに以下のように設定します(カスタムパネルの使用方法はこの質問には関係しません)。

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

私のFooControlのコードでは、自動的に作成されたFooPanelのインスタンスにアクセスしたいと考えています。 Reflectorを見ると、ItemsControlにItemsHostというプロパティがありますが、ItemsHostが内部であるため、FooControlからアクセスできません。

誰かがFooPanelのインスタンスを参照する信頼できる方法を提案できますか?

答えて

1

残念ながら、ItemsControlコントロールはこの要素への参照を公開していません(実際、ItemsControlはそれ自体にアクセスしていないと感じています)。

前の投稿のようにVisualTreeHelper.GetChild()を使用しても問題ありませんが、アイテムコントロールが下にネストされるようにアイテムコントロールがリビルドされていると、ブレークします。

Aの参照を取得するために、わずかに少ない脆弱な(まだ遠い完璧から)の方法は、最初の子のコンテナの親を取得することです

Panel itemsPanel; 

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

    itemsPanel = VisualTreeHelper.GetParent(firstContainer) as Panel; 
} 
(あなたの項目の制御が少なくとも一つの項目が含まれていることを仮定して)

注:これはItemContainerGeneratorプロパティを使用しているため、SL3以降でのみ機能します(SL2の回避策が存在する可能性があります)

0

VisualTreeHelper.GetChild(...)を使用できます。私はあなたのItemsControlサブクラスの最初または2番目の子でなければならないと思います。

関連する問題