7 votes

Contrôle personnalisé WPF - Le modèle ItemsControl n'est pas appliqué

Je suis en train de créer un contrôle WPF personnalisé qui dérive de TabControl. Dans le ControlTemplate, j'utilise un ItemsControl pour afficher une liste qui est liée au modèle (une collection observable de type FileMenuItem). Pendant l'exécution du programme, j'obtiens l'erreur suivante dans la fenêtre de sortie :

ItemTemplate et ItemTemplateSelector sont ignorés pour les éléments déjà de type type de conteneur du ItemsControl ; Type='FileMenuItem

Le type FileMenuItem est dérivé de MenuItem. Si je change la classe de base en DependencyObject, le code s'exécute réellement et le modèle est appliqué (c'est donc une option). J'ai recherché cette erreur sur Google et je n'ai rien trouvé à ce sujet. Quelqu'un a-t-il rencontré ce problème lors du développement de contrôles personnalisés ? Même si j'ai une solution de contournement, j'aimerais comprendre ce qui se passe, et je pense que l'utilisation du MenuItem comme classe de base est une mise en œuvre plus propre.

Je peux poster plus de code si cela peut aider. Merci !

7voto

John Bowen Points 14985

Le but d'un DataTemplate (comme ItemTemplate) est de fournir une visualisation pour un objet de données. Plus précisément, il définit un ensemble d'éléments à ajouter à l'arbre visuel à la place des données fournies à un ContentPresenter ou ItemsPresenter. Dans votre cas, votre liste source est une collection d'objets qui peuvent déjà être ajoutés directement à l'arbre visuel pour être affichés dans l'interface utilisateur.

Vous pouvez le voir dans l'exemple simplifié suivant où seul "Trois" apparaît en rouge car les deux premiers éléments sont définis dans un formulaire qui peut être affiché directement par ComboBox.

<ComboBox>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding}" Foreground="Red"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
    <ComboBoxItem>One</ComboBoxItem>
    <ComboBoxItem>Two</ComboBoxItem>
    <sys:String>Three</sys:String>
</ComboBox>

Prograide.com

Prograide est une communauté de développeurs qui cherche à élargir la connaissance de la programmation au-delà de l'anglais.
Pour cela nous avons les plus grands doutes résolus en français et vous pouvez aussi poser vos propres questions ou résoudre celles des autres.

Powered by:

X