Dans une application WPF, dans l'application MVP, j'ai une zone de liste déroulante, pour laquelle j'affiche les données extraites de Database. Avant les éléments ajoutés à la zone de liste déroulante, je souhaite afficher le texte par défaut tel que
" -- Choisis une équipe --"
de sorte que lors du chargement de la page, il s'affiche et lors de sa sélection, le texte doit être effacé et les éléments doivent être affichés.
La sélection des données de la base de données est en cours. Je dois afficher le texte par défaut jusqu'à ce que l'utilisateur sélectionne un élément dans la zone de liste déroulante.
Guidez-moi s'il-vous-plaît
Focusable="False" IsEditable="True" IsReadOnly="True"
Vous pouvez le faire sans aucun code en utilisant un fichier
IValueConverter
.Ici, vous avez la classe de convertisseur que vous pouvez réutiliser.
Et enfin, vous devez déclarer votre convertisseur dans une section de ressources.
Où Converters est l'endroit où vous avez placé la classe de convertisseur. Un exemple est:
La très bonne chose à propos de cette approche est qu'il n'y a pas de répétition de code dans votre code derrière.
la source
DataTrigger
pour éviter même le code du convertisseur ici :)J'aime la réponse de Tri Q, mais ces convertisseurs de valeur sont difficiles à utiliser. PaulB l'a fait avec un gestionnaire d'événements, mais c'est également inutile. Voici une solution XAML pure:
la source
Personne n'a dit qu'une solution pure de xaml devait être compliquée. En voici un simple, avec 1 déclencheur de données dans la zone de texte. Marge et position comme vous le souhaitez
la source
<Setter Property="Visibility" Value="Hidden"/>
dehors du déclencheur (à l'intérieur du style) et supprimerVisibility="Hidden"
de l'élément de bloc de texte réelSitué
IsEditable="True"
sur l'ComboBox
élément. Cela affichera laText
propriété duComboBox
.la source
Je ne sais pas s'il est directement pris en charge, mais vous pouvez superposer le combo avec une étiquette et le définir sur masqué si la sélection n'est pas nulle.
par exemple.
Puis dans la sélection a changé de gestionnaire ...
la source
Sur la base de la réponse d'IceForge, j'ai préparé une solution réutilisable:
style xaml:
exemple d'utilisation:
la source
Je ne l'ai pas essayé avec des combos mais cela a fonctionné pour moi avec d'autres contrôles ...
post de blog ageektrapped
Il utilise ici le calque adorner pour afficher un filigrane.
la source
La solution de HappyNomad était très bonne et m'a aidé à arriver à cette solution légèrement différente.
la source
Le moyen le plus simple est d'utiliser CompositeCollection pour fusionner le texte par défaut et les données de la base de données directement dans ComboBox, par exemple
Et dans Resources, définissez StaticResource pour lier les options ComboBox à votre DataContext, car la liaison directe dans CollectionContainer ne fonctionne pas correctement.
De cette façon, vous pouvez définir vos options ComboBox uniquement en xaml, par exemple
la source
Je recommanderais ce qui suit:
Définir un comportement
Utilisateur le comportement
la source
La réponse d'IceForge était assez proche et AFAIK est la solution la plus simple à ce problème. Mais il a manqué quelque chose, car cela ne fonctionnait pas (du moins pour moi, il n'affiche jamais le texte).
En fin de compte, vous ne pouvez pas simplement définir la propriété "Visibility" du TextBlock sur "Hidden" pour qu'elle soit masquée lorsque l'élément sélectionné de la zone de liste déroulante n'est pas nul; vous devez le définir de cette façon par défaut (puisque vous ne pouvez pas vérifier non null dans les déclencheurs , en utilisant un Setter en XAML au même endroit que les Triggers.
Voici la solution réelle basée sur la sienne, le Setter manquant étant placé juste avant les déclencheurs:
la source
EDIT: Selon les commentaires ci-dessous, ce n'est pas une solution. Je ne sais pas comment je l'ai fait fonctionner et je ne peux pas vérifier ce projet.
Il est temps de mettre à jour cette réponse pour le dernier XAML.
En trouvant cette question SO à la recherche d'une solution à cette question, j'ai ensuite constaté que la spécification XAML mise à jour avait une solution simple.
Un attribut appelé "Espace réservé" est désormais disponible pour accomplir cette tâche. C'est aussi simple que cela (dans Visual Studio 2015):
la source
PlaceholderText
propriété dans laSystem.Windows.ComboBox
classe . C'est une question sur WPF, pas sur WinForms.Pas la meilleure pratique ... mais fonctionne bien ...
Code derrière
la source
Je pense qu'un filigrane comme mentionné dans cet article fonctionnerait bien dans ce cas
Il y a un peu de code nécessaire mais vous pouvez le réutiliser pour n'importe quelle zone de liste déroulante ou zone de texte (et même des boîtes de mot de passe), donc je préfère cette façon
la source
J'utilise une classe IsNullConverter dans mon projet et cela a fonctionné pour moi. voici le code pour cela en c #, créez un dossier nommé Converter et ajoutez cette classe dans ce dossier, car le déclencheur utilisé ne prend pas en charge la valeur pour plutôt que null, et IsNullConverter fait juste cela
ajoutez l'espace de noms dans le fichier xaml comme ceci.
veux dire
utilisez cette ligne sous les ressources pour la rendre disponible via le code xaml
voici le code xaml, j'ai utilisé ici le déclencheur donc chaque fois qu'un élément est sélectionné dans la zone de liste déroulante, la visibilité de votre texte devient fausse.
la source
// Code XAML
// Code ViewModel
la source
Un peu tard mais ..
Un moyen plus simple serait d'ajouter un élément de données factice à la liste avec le paramètre IsDummy = true et de s'assurer qu'il n'est pas HitTestVisable et que sa hauteur est de 1 pixel (en utilisant un convertisseur) afin qu'il ne soit pas vu.
Enregistrez-vous simplement sur SelectionChanged et définissez l'index sur l'index de l'élément factice.
Cela fonctionne comme un charme et de cette façon, vous ne jouez pas avec le style et les couleurs de la ComboBox ou du thème de votre application.
la source
Le code ci-dessus montre le moyen le plus simple d'y parvenir. Après le chargement de la fenêtre, déclarez le texte de la zone de liste déroulante à l'aide de la propriété .Text de la zone de liste déroulante. Cela peut également être étendu au DatePicker, à la zone de texte et à d'autres contrôles.
la source
Je l'ai fait avant de lier la zone de liste déroulante avec les données de la base de données dans codebehind comme ceci -
la source
Mettez une étiquette sur la zone de liste déroulante.
Liez le contenu de l'étiquette à la propriété Text de la zone de liste déroulante.
Définissez l'opacité de la zone de liste déroulante sur zéro, Opacité = 0.
Écrire le texte par défaut dans la propriété Text de la zone de liste déroulante
la source
Définissez uniquement l'attribut IsEditable sur true
la source
Je sais que c'est semi-vieux mais qu'en est-il de cette façon:
la source
ComboBox
n'a pas deEmptySelectionBoxTemplate
propriété.