2010-06-08 4 views
1

J'essaye de créer un ItemsControl qui a un séparateur entre les éléments, par exemple un contrôle pour créer une miette de pain de navigation. Je veux que le contrôle soit complètement générique.Instancier ItemsPanelTemplate

Ma méthode d'origine consistait à créer une extension ItemsControl, à ajouter une propriété SeparatorTemplate, puis à ajouter des séparateurs au ItemsHost de ItemsControl. Le problème avec cette approche est que si vous ajoutez des éléments supplémentaires au panneau de conteneur, le ItemGenerator est confus et les éléments sont hors service et ne sont pas supprimés correctement. Donc mon deuxième plan était de créer un tout nouveau contrôle qui émulerait un ItemsControl, mais le problème que je rencontre est que je ne peux pas trouver un moyen d'instancier un ItemsPanelTemplate. Je voudrais fournir une propriété ItemsPanel comme ItemsControl, mais je ne peux pas créer un panneau à partir de ce modèle.

Quelqu'un peut-il penser à un moyen d'instancier un ItemsPanelTemplate ou un moyen d'ajouter des contrôles au panneau d'un ItemsControl sans casser le ItemGenerator?

Répondre

0

Eh bien, je ne l'ai pas essayé moi-même mais j'aurais pensé que vous remplacerait le GetContainerForItemOverride pour y parvenir.

Vous pouvez créer un nouveau contrôle BreadCrumbItem qui est un ContentControl qui a basé sur un modèle dans son modèle par défaut le ContentPresenter typique et tout ce que vous voulez utiliser par défaut comme séparateur tous dans un Grid ou StackPanel.

Le GetContainerForItemOverride génère une nouvelle instance de cette BreadCrumbItem définit sa ContentTemplate à la ItemTemplate propriété de votre dérivé ItemsControl (le contrôle BreadCrumb?).

Votre BreadCrumb contrôle exposerait également BreadCrumbItemStyle la propriété que vous attribuez à la BreadCrumbItem vous créez pendant GetContainerForItemOverride.

Par souci d'exhaustivité, vous devrez peut-être également implémenter les autres méthodes *Container*Override dans votre contrôle BreadCrumb.

+0

J'espérais éviter d'avoir à inclure le séparateur dans ItemContainer. Si je l'inclue dans le template par défaut, j'ai besoin de gérer le dernier élément pour que le séparateur ne soit pas visible sur le dernier élément. L'autre problème avec l'inclusion dans ItemContainer est qu'il ne suivra pas la disposition du ItemsPanel. Je veux pouvoir fournir n'importe quel ItemsPanel et l'avoir correctement mis en page comme s'il s'agissait d'un autre élément. – Stephan

+0

@Stephan: Bons points. L'inclusion d'un état visuel "LastItem" peut aider avec la "gestion" du séparateur supplémentaire est inévitable indépendamment de la solution. En ce qui concerne l'orientation, c'est le choix du concepteur qui remplace le panneau par défaut, il suffira de remplacer le modèle 'BreadCrumbItem' via la propriété' BreadCrumbItemStyle'. Personnellement, je pense que c'est un endroit raisonnable. Le contrôle fait un travail acceptable hors de la boîte et peut être dénommé au-delà de la reconnaissance si le consommateur le souhaite. – AnthonyWJones

+0

Eh bien, j'ai décidé de surcharger ItemsSource, puis d'insérer des séparateurs dans la liste et de l'insérer dans la source Items actuelle. Je sais que ce n'est peut-être pas le moyen le plus sûr puisque quelqu'un peut accéder à 'base.ItemsSource', mais cela m'a donné ce que je cherchais. Merci de votre aide. – Stephan

Questions connexes