2009-07-07 8 views
4

Je crée un contrôle personnalisé appelé FooControl dérivé de ItemsControl dont le style par défaut est défini pour les mêmes dans themes \ generic.xaml. Le style par défaut de FooControl définit la propriété ItemsPanel sur un autre panneau personnalisé appelé FooPanel comme indiqué ci-dessous (je ne pense pas que l'utilisation du panneau personnalisé soit importante pour cette question).Comment accéder à ItemsHost d'un contrôle personnalisé dérivé ItemsControl

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

Dans le code derrière de mon FooControl, je veux avoir accès à l'instance de FooPanel qui a été créé automatiquement. En regardant dans le réflecteur j'ai trouvé que ItemsControl a une propriété appelée ItemsHost mais je ne peux pas y accéder depuis FooControl car ItemsHost est interne

Quelqu'un peut-il me suggérer un moyen fiable d'obtenir une référence à l'instance de FooPanel?

Répondre

1

Malheureusement, le contrôle ItemsControl n'expose pas une référence à cet élément (en fait, j'ai l'impression que ItemsControl n'y a même pas accès). L'utilisation de VisualTreeHelper.GetChild() comme suggéré dans la publication précédente peut fonctionner, mais elle sera interrompue si le contrôle des éléments est redéfini de telle sorte que le panneau des éléments soit imbriqué plus bas.

Un peu moins fragile (mais encore loin d'être parfait) façon d'obtenir une référence est d'obtenir le parent du conteneur pour le premier enfant (en supposant que votre contrôle d'éléments contient au moins un élément)

Panel itemsPanel; 

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

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

Remarque: Cela ne fonctionne que dans SL3 et au-dessus car il utilise la propriété ItemContainerGenerator (je crois qu'un travail de contour peut exister pour SL2)

0

Vous pouvez utiliser VisualTreeHelper.GetChild (...). Je crois qu'il devrait être le premier ou deuxième enfant de votre sous-classe ItemsControl.

Questions connexes