WPF ComboBox - Montrer quelque chose de différent lors de la sélection d'une valeur
Ce dont j'ai besoin pour accomplir, c'est une zone de liste déroulante qui montre que les Personnes. Lorsque vous développez la liste déroulante il montre FirstName et LastName, mais quand vous sélectionnez une personne, la valeur affichée dans la zone de liste déroulante doit être juste le prénom de la personne.
J'ai le texte suivant ItemTemplate:
<ComboBox.ItemTemplate>
<DataTemplate>
<StackPanel Orientation="Horizontal">
<TextBlock Text="{Binding FirstName}" />
<TextBlock Text=" " />
<TextBlock Text="{Binding LastName}" />
</StackPanel>
</DataTemplate>
</ComboBox.ItemTemplate>
Que dois-je faire pour afficher seulement le nom de la première quand un élément est sélectionné?
Merci!
MODIFIER
Changé la question légèrement: Que faire si j'ai le droit à l'image et au lieu d'afficher simplement le nom de la première lorsqu'une personne est sélectionnée, je veux afficher uniquement l'image. En d'autres termes, comment puis-je avoir deux modèles distincts - un pour la liste déroulante et un pour l'élément sélectionné?
OriginalL'auteur Gus Cavalcanti | 2009-07-17
Vous devez vous connecter pour publier un commentaire.
Mettre un Trigger sur le DataTemplate. Le déclencheur doit vérifier la propriété IsSelected (le DataTemplate aurez besoin d'un TargetType ensemble pour que cela fonctionne). Si elle est sélectionnée, vous pouvez définir la Visibilité de votre TextBlocks s'est Effondré, et de définir la Visibilité de l'Image Visible. Puis faire le contraire pour le cas où il n'est pas sélectionné.
OriginalL'auteur Charlie
Voici la solution:
En gros, vous créez une couche de DataTemplate ici. ComboBox es ItemTemplate reste toujours la même. Mais le contenu à l'intérieur de ce modèle s'adapte à la condition que vous êtes intéressé à.
L'astuce pour discriminer tombé en bas combobox contre les éléments sélectionnés de la zone de l'élément de zone de liste déroulante est que dans un domaine choisi n'est pas vraiment enfermé dans ComboBoxItem objet, c'est une partie de la zone de liste déroulante contrôle de lui-même. Donc FindAncestor pour ComboBoxItem renvoie la valeur null, que nous utilisons dans le déclencheur.
Seul problème, c'est qu'il provoque de WPF à feu de liaison des erreurs dues à ne jamais trouver l'ancêtre.
OriginalL'auteur Oleg Mihailik
Je l'ai eu. J'ai juste besoin d'ajouter ce qui suit à mon ComboBox:
Merci pour cela, besoin d'une solution simple pour cela.
L'amour, EXACTEMENT ce que je cherchais!
OriginalL'auteur Gus Cavalcanti
Une autre option est d'utiliser
ItemTemplateSelector
au lieu deItemTemplate
. J'ai été en utilisant la manière suivante.ComboBoxItemTemplateSelector
dérive deDataTemplateSelector
et a deux propriétés attachées,SelectedTemplate
etDropDownTemplate
. Ensuite, nous avons défini les DataTemplates de Xaml comme ceDans SelectTemplate nous vérifions si le conteneur est emballé dans un
ComboBoxItem
et si elle l'est, nous reviendrons sur l'DropDownTemplate
. Sinon, retournerSelectedTemplate
.Un petit projet de démonstration qui utilise ce peut être téléchargé ici: ComboBoxItemTemplateDemo.zip
J'ai aussi réalisé un court-blog-post à ce sujet ici: Différents ComboBox ItemTemplate pour déroulante. Il montre aussi l'autre moyen évident de faire la même chose mais avec des propriétés, au lieu de propriétés attachées dans
ComboBoxItemTemplateSelector
.Oh, et GetVisualParent. Tout le monde semble avoir leurs propres implémentations de cela, mais de toute façon, voici celui que j'utilise
OriginalL'auteur Fredrik Hedblad
J'ai utilisé approche suivante
Et le comportement
a travaillé comme un charme. N'aime pas assez bien Chargé cas ici, mais vous pouvez le réparer si vous voulez
OriginalL'auteur Artiom