Comment afficher le texte par défaut «--Sélectionnez l'équipe -» dans la zone de liste déroulante sur pageload dans WPF?

109

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

utilisateur301016
la source

Réponses:

108

Le moyen le plus simple que j'ai trouvé pour le faire est:

<ComboBox Name="MyComboBox"
 IsEditable="True"
 IsReadOnly="True"
 Text="-- Select Team --" />

Vous devrez évidemment ajouter vos autres options, mais c'est probablement la façon la plus simple de le faire.

Il y a cependant un inconvénient à cette méthode qui est que le texte à l'intérieur de votre zone de liste déroulante ne sera pas modifiable, il est toujours sélectionnable. Cependant, étant donné la mauvaise qualité et la complexité de chaque alternative que j'ai trouvée à ce jour, c'est probablement la meilleure option.

Chris Walter
la source
Bonne réponse Chris! J'ajouterais simplement Focusable = "True", mais ce n'est qu'un changement cosmétique.
Slavisa
6
réponse parfaite Chris. Une propriété peut faire une si grande différence: D
Aster Veigas
4
Focusable="False" IsEditable="True" IsReadOnly="True"
Kamil Lelonek
1
+1. Malheureusement, cela ne fonctionne pas avec des éléments mixtes (par exemple si les éléments combobox sont des images).
greenoldman
11
Solution simple et fonctionnelle. Les contrôles WPF ont ce genre de problèmes dans tout le framework. Ici et là, les contrôles manquent des fonctionnalités dont la plupart des développeurs auraient besoin. En conséquence, les développeurs perdent leur temps à rechercher des solutions, à acheter des contrôles alternatifs tiers ou à mettre en œuvre des solutions de contournement ... L'équipe WPF utilise-t-elle même ses contrôles pour ses propres développements?
Damn Vegetables
90

Vous pouvez le faire sans aucun code en utilisant un fichier IValueConverter.

<Grid>
   <ComboBox
       x:Name="comboBox1"
       ItemsSource="{Binding MyItemSource}"  />
   <TextBlock
       Visibility="{Binding SelectedItem, ElementName=comboBox1, Converter={StaticResource NullToVisibilityConverter}}"
       IsHitTestVisible="False"
       Text="... Select Team ..." />
</Grid>

Ici, vous avez la classe de convertisseur que vous pouvez réutiliser.

public class NullToVisibilityConverter : IValueConverter
{
    #region Implementation of IValueConverter

    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value == null ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }

    #endregion
}

Et enfin, vous devez déclarer votre convertisseur dans une section de ressources.

<Converters:NullToVisibilityConverter x:Key="NullToVisibilityConverter" />

Où Converters est l'endroit où vous avez placé la classe de convertisseur. Un exemple est:

xmlns:Converters="clr-namespace:MyProject.Resources.Converters"

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.

Tri Q Tran
la source
Je voudrais l'utiliser, mais il semble que cela ne soit pas autorisé dans les cas où la zone de liste déroulante est l'en-tête d'une grille de données. . . XAML donne une erreur indiquant que l'en-tête est déjà défini (ou peut-être ne peut pas être défini plus d'une fois). Des idées? Je pense juste à utiliser une option de valeur nulle, qui permettra ensuite une réinitialisation en la sélectionnant, mais semble un peu bâclée.
Paul Gibson
1
Une des principales raisons pour lesquelles il s'agit d'une excellente solution est que presque tous les projets WPF liés aux données utilisent un NullToVisibilityConverter, donc il est déjà là la plupart du temps - autant l'utiliser!
tpartee
2
En fait, vous pouvez utiliser un DataTriggerpour éviter même le code du convertisseur ici :)
Billy ONeal
49

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:

<ContentControl Content="{Binding YourChoices}">
    <ContentControl.ContentTemplate>
        <DataTemplate>
            <Grid>
                <ComboBox x:Name="cb" ItemsSource="{Binding}"/>
                <TextBlock x:Name="tb" Text="Select Something" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <DataTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ContentControl.ContentTemplate> 
</ContentControl>
HappyNomad
la source
33

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

<Grid>
    <ComboBox x:Name="mybox" ItemsSource="{Binding}"/>
    <TextBlock Text="Select Something" IsHitTestVisible="False">
           <TextBlock.Style>
                <Style TargetType="TextBlock">
                      <Setter Property="Visibility" Value="Hidden"/>
                      <Style.Triggers>
                            <DataTrigger Binding="{Binding ElementName=mybox,Path=SelectedItem}" Value="{x:Null}">
                                  <Setter Property="Visibility" Value="Visible"/>
                             </DataTrigger>
                      </Style.Triggers>
                </Style>
           </TextBlock.Style>
     </TextBlock>
</Grid>
IceForge
la source
5
J'avais besoin de déplacer "Visibility =" Hidden "dans le déclencheur de données. Ensuite, cela a fonctionné comme prévu. Certainement l'approche la plus directe que j'ai vue. Pour la réutilisation, j'ai déplacé le style dans une ressource
Mitch
La réponse de @Mitch IceForce ne fonctionne pas pour moi, qu'avez-vous changé pour que cela fonctionne?
Chris
1
@Chris Je pense qu'il voulait dire ajouter en <Setter Property="Visibility" Value="Hidden"/>dehors du déclencheur (à l'intérieur du style) et supprimer Visibility="Hidden"de l'élément de bloc de texte réel
Réintégrer Monica s'il vous plaît
@Mitch, comment déplacer le style Textblock dans une ressource à réutiliser si vous avez le ElementName dans le DataTrigger pointant vers un objet spécifique (mybox)? Existe-t-il un moyen de spécifier ce nom de manière générique?
CrApHeR
24

Situé IsEditable="True"sur l' ComboBoxélément. Cela affichera la Textpropriété du ComboBox.

méduse
la source
2
C'est la solution la plus simple de tout.
Sergey Koulikov
6
cela change à quoi ressemble le contrôle
simonalexander2005
16

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.

<Grid>
   <ComboBox Text="Test" Height="23" SelectionChanged="comboBox1_SelectionChanged" Name="comboBox1" VerticalAlignment="Top" ItemsSource="{Binding Source=ABCD}"  />
   <TextBlock IsHitTestVisible="False" Margin="10,5,0,0" Name="txtSelectTeam" Foreground="Gray" Text="Select Team ..."></TextBlock>
</Grid>

Puis dans la sélection a changé de gestionnaire ...

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    txtSelectTeam.Visibility = comboBox1.SelectedItem == null ? Visibility.Visible : Visibility.Hidden;
}
PaulB
la source
1
Au lieu de créer un gestionnaire SelectionChanged, la visibilité du TextBlock peut être définie en XAML.
aliceraunsbaek
6

Sur la base de la réponse d'IceForge, j'ai préparé une solution réutilisable:

style xaml:

<Style x:Key="ComboBoxSelectOverlay" TargetType="TextBlock">
    <Setter Property="Grid.ZIndex" Value="10"/>
    <Setter Property="Foreground" Value="{x:Static SystemColors.GrayTextBrush}"/>
    <Setter Property="Margin" Value="6,4,10,0"/>
    <Setter Property="IsHitTestVisible" Value="False"/>
    <Setter Property="Visibility" Value="Hidden"/>
    <Style.Triggers>
        <DataTrigger Binding="{Binding}" Value="{x:Null}">
            <Setter Property="Visibility" Value="Visible"/>
        </DataTrigger>
    </Style.Triggers>
</Style>

exemple d'utilisation:

<Grid>
     <ComboBox x:Name="cmb"
               ItemsSource="{Binding Teams}" 
               SelectedItem="{Binding SelectedTeam}"/>
     <TextBlock DataContext="{Binding ElementName=cmb,Path=SelectedItem}"
               Text=" -- Select Team --" 
               Style="{StaticResource ComboBoxSelectOverlay}"/>
</Grid>
aussi
la source
Agréable. Je l'ai étendu en liant le DataContext du TextBlock à l'aide d'une source relative afin d'éviter d'avoir à définir le nom. Voir le prochain commentaire pour Markup (le code dans les commentaires de SO semble moche)
Sascha
<TextBlock DataContext = "{Binding Path = Children [0] .SelectedItem, RelativeSource = {RelativeSource AncestorType = Grid}}" Text = "- Sélectionnez un projet -" Style = "{StaticResource ComboBoxSelectOverlay}" />
Sascha
4

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.

Crippéoblade
la source
Je viens de télécharger et d'essayer ce code. Cela semble fonctionner comme annoncé. Vous permet de décorer votre combo avec une simple propriété attachée contenant votre filigrane. Cela fonctionne également pour d'autres contrôles. C'est une bien meilleure approche que n'importe laquelle des autres réponses à cette question.
Ian Oakes
Bon truc, non seulement cela résout le problème ComboBox, mais maintenant je peux me débarrasser de l'assemblage WPF Tools et l'utiliser simplement sur mes TextBoxes au lieu du contrôle WatermarkedTextBox aussi, tellement plein de victoire :) - oh btw c'est un geek piégé non Piège convenu!
dain le
2

La solution de HappyNomad était très bonne et m'a aidé à arriver à cette solution légèrement différente.

<ComboBox x:Name="ComboBoxUploadProject" 
    Grid.Row="2"
    Width="200" 
    Height="23"                           
    Margin="64,0,0,0"
    ItemsSource="{Binding projectList}"
    SelectedValue ="{Binding projectSelect}" 
    DisplayMemberPath="projectName"
    SelectedValuePath="projectId"
    >
    <ComboBox.Template>
        <ControlTemplate TargetType="ComboBox">
            <Grid>
                <ComboBox x:Name="cb" 
                    DataContext="{Binding RelativeSource={RelativeSource TemplatedParent}}" 
                    ItemsSource="{Binding ItemsSource, RelativeSource={RelativeSource TemplatedParent}}"
                    SelectedValue ="{Binding SelectedValue, RelativeSource={RelativeSource TemplatedParent}}" 
                    DisplayMemberPath="projectName"
                    SelectedValuePath="projectId"
                    />
                <TextBlock x:Name="tb" Text="Select Item..." Margin="3,3,0,0" IsHitTestVisible="False" Visibility="Hidden"/>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger SourceName="cb" Property="SelectedItem" Value="{x:Null}">
                    <Setter TargetName="tb" Property="Visibility" Value="Visible"/>
                </Trigger>
            </ControlTemplate.Triggers>
        </ControlTemplate>
    </ComboBox.Template>
</ComboBox>
Nick Falco
la source
2

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

    <ComboBox x:Name="SelectTeamComboBox" SelectedIndex="0">
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <ComboBoxItem Visibility="Collapsed">-- Select Team --</ComboBoxItem>
                <CollectionContainer Collection="{Binding Source={StaticResource ResourceKey=MyComboOptions}}"/>
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>

Et dans Resources, définissez StaticResource pour lier les options ComboBox à votre DataContext, car la liaison directe dans CollectionContainer ne fonctionne pas correctement.

<Window.Resources>
    <CollectionViewSource Source="{Binding}" x:Key="MyComboOptions" />
</Window.Resources>

De cette façon, vous pouvez définir vos options ComboBox uniquement en xaml, par exemple

   <ComboBox x:Name="SelectTeamComboBox" SelectedIndex="0">
        <ComboBox.ItemsSource>
            <CompositeCollection>
                <ComboBoxItem Visibility="Collapsed">-- Select Team --</ComboBoxItem>
                <ComboBoxItem >Option 1</ComboBoxItem>
                <ComboBoxItem >Option 2</ComboBoxItem>
            </CompositeCollection>
        </ComboBox.ItemsSource>
    </ComboBox>
Zap
la source
1

Je recommanderais ce qui suit:

Définir un comportement

public static class ComboBoxBehaviors
{
    public static readonly DependencyProperty DefaultTextProperty =
        DependencyProperty.RegisterAttached("DefaultText", typeof(String), typeof(ComboBox), new PropertyMetadata(null));

    public static String GetDefaultText(DependencyObject obj)
    {
        return (String)obj.GetValue(DefaultTextProperty);
    }

    public static void SetDefaultText(DependencyObject obj, String value)
    {
        var combo = (ComboBox)obj;

        RefreshDefaultText(combo, value);

        combo.SelectionChanged += (sender, _) => RefreshDefaultText((ComboBox)sender, GetDefaultText((ComboBox)sender));

        obj.SetValue(DefaultTextProperty, value);
    }

    static void RefreshDefaultText(ComboBox combo, string text)
    {
        // if item is selected and DefaultText is set
        if (combo.SelectedIndex == -1 && !String.IsNullOrEmpty(text))
        {
            // Show DefaultText
            var visual = new TextBlock()
            {
                FontStyle = FontStyles.Italic,
                Text = text,
                Foreground = Brushes.Gray
            };

            combo.Background = new VisualBrush(visual)
            {
                Stretch = Stretch.None,
                AlignmentX = AlignmentX.Left,
                AlignmentY = AlignmentY.Center,
                Transform = new TranslateTransform(3, 0)
            };
        }
        else
        {
            // Hide DefaultText
            combo.Background = null;
        }
    }
}

Utilisateur le comportement

<ComboBox Name="cmb" Margin="72,121,0,0" VerticalAlignment="Top"
          local:ComboBoxBehaviors.DefaultText="-- Select Team --"/>
Usman Zafar
la source
Cela fonctionne comme un charme pour une seule boîte combo. Mais quand je l'utilise avec plus d'un combo, cela me donne une erreur (mais compile et fonctionne bien) "'DefaultText' Propriété déjà enregistrée par 'ComboBox'". J'ai mentionné le correctif dans mon blog.
Romesh D. Niriella
Merci de l'avoir signalé. Je n'ai pas pu produire cette erreur sur mon ordinateur. Cependant, je suis d'accord que typeof (ComboBoxBehaviors) doit être passé dans le 3ème paramètre de RegisterAttached au lieu de typeof (ComboBox).
Usman Zafar
Bien que cet article soit un peu vieux, je ne vois pas comment cela peut fonctionner. Le bg du combo est défini via des déclencheurs avec plusieurs conditions. Essayez de placer un combo seul sur une grille et de régler manuellement bg sur «rouge». Cela n'a aucun effet sur la zone où vous souhaitez qu'un filigrane apparaisse. Cela ne peut affecter que le bg derrière le panneau déroulant. Une meilleure solution consiste à copier le modèle de contrôle de la zone de liste déroulante et à ajouter quelques déclencheurs et styles pour peindre un pinceau visuel constitué d'un bloc de texte dans l'arrière-plan de la bordure.
Newclique
1

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:

<ComboBox x:Name="combo"/>
<TextBlock Text="--Select Team--" IsHitTestVisible="False">
    <TextBlock.Style>
        <Style TargetType="TextBlock">

            <Style.Setters>
                <Setter Property="Visibility" Value="Hidden"/>
            </Style.Setters>

            <Style.Triggers>
                <DataTrigger Binding="{Binding ElementName=combo,Path=SelectedItem}" Value="{x:Null}">
                    <Setter Property="Visibility" Value="Visible"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBlock.Style>
</TextBlock>
Kilazur
la source
1

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):

<ComboBox x:Name="Selection" PlaceholderText="Select...">
    <x:String>Item 1</x:String>
    <x:String>Item 2</x:String>
    <x:String>Item 3</x:String>
</ComboBox>
Robb Sadler
la source
J'ai utilisé cette solution - l'électeur négatif se soucie-t-il d'élaborer? Certes, je ne suis pas un expert XAML, mais cela a fonctionné.
Robb Sadler
1
Bien que je ne sois pas le contrevenant, j'imagine que vous avez voté contre parce qu'il n'y a pas de PlaceholderTextpropriété dans la System.Windows.ComboBoxclasse . C'est une question sur WPF, pas sur WinForms.
Sheridan
Mec, c'est bizarre - je sais que je travaillais sur une application XAML, et je sais que je venais de le découvrir et de le voir fonctionner. Peut-être qu'une extension a été incluse dans le projet? IDK - J'ai depuis cherché et c'est sûr qu'il n'y a pas d'espace réservé dans ComboBox. Je ne peux pas revenir au projet sur lequel je travaillais - ancien client. Pouah.
Robb Sadler
2
Vous n'avez pas tort, mais ce n'est pas pour WPF. UWP ComboBox a ceci, veuillez consulter cette page: msdn.microsoft.com/en-us/library/windows/apps/…
laishiekai
0

Pas la meilleure pratique ... mais fonctionne bien ...

<ComboBox GotFocus="Focused"  x:Name="combobox1" HorizontalAlignment="Left" Margin="8,29,0,0" VerticalAlignment="Top" Width="128" Height="117"/>

Code derrière

public partial class MainWindow : Window
{
    bool clearonce = true;
    bool fillonce = true;
    public MainWindow()
    {
        this.InitializeComponent();          
        combobox1.Items.Insert(0, " -- Select Team --");
        combobox1.SelectedIndex = 0;
    }

    private void Focused(object sender, RoutedEventArgs e)
    {
            if(clearonce)
            {
                combobox1.Items.Clear();
                clearonce = false;
            }
            if (fillonce)
            {
              //fill the combobox items here 
                for (int i = 0; i < 10; i++)
                {
                    combobox1.Items.Insert(i, i);
                }
                fillonce = false;
            }           
    }
}
Madi D.
la source
0

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

IntrépideHyena
la source
0

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

 public class IsNullConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return (value == null);
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new InvalidOperationException("IsNullConverter can only be used OneWay.");
    }
}

ajoutez l'espace de noms dans le fichier xaml comme ceci.

xmlns:Converters="clr-namespace:TymeSheet.Converter"

veux dire

xmlns:Converters="clr-namespace:YourProjectName.Converter"

utilisez cette ligne sous les ressources pour la rendre disponible via le code xaml

<Converters:IsNullConverter x:Key="isNullConverter" />

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.

<TextBlock Text="Select Project" IsHitTestVisible="False" FontFamily="/TimeSheet;component/Resources/#Open Sans" FontSize="14" Canvas.Right="191" Canvas.Top="22">
                        <TextBlock.Resources>
                            <Converters:IsNullConverter x:Key="isNullConverter"/>
                        </TextBlock.Resources>
                        <TextBlock.Style>
                            <Style TargetType="TextBlock">
                                <Style.Triggers>
                                    <DataTrigger Binding="{Binding ElementName=ProjectComboBox,Path=SelectedItem,Converter={StaticResource isNullConverter}}" Value="False">
                                        <Setter Property="Visibility" Value="Hidden"/>
                                    </DataTrigger>
                                </Style.Triggers>
                            </Style>
                        </TextBlock.Style>
                    </TextBlock>
Safwan
la source
0

// Code XAML

// Code ViewModel

    private CategoryModel _SelectedCategory;
    public CategoryModel SelectedCategory
    {
        get { return _SelectedCategory; }
        set
        {
            _SelectedCategory = value;
            OnPropertyChanged("SelectedCategory");
        }
    }

    private ObservableCollection<CategoryModel> _Categories;
    public ObservableCollection<CategoryModel> Categories
    {
        get { return _Categories; }
        set
        {
            _Categories = value;
            _Categories.Insert(0, new CategoryModel()
            {
                CategoryId = 0,
                CategoryName = " -- Select Category -- "
            });
            SelectedCategory = _Categories[0];
            OnPropertyChanged("Categories");

        }
    }
crypticresearchlab
la source
0

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.

Eibi
la source
0
InitializeComponent()
yourcombobox.text=" -- Select Team --";

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.

Ketan Dubey
la source
0

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 -

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
Atiq Baqi
la source
1
Cela ajoute simplement le texte en option dans la liste déroulante. Ce n'était pas ce que demandait le PO.
Dean Friedland
il s'agit d'ajouter du texte par défaut et je l'ai fait de cette manière
Atiq Baqi
0
  1. Mettez une étiquette sur la zone de liste déroulante.

  2. Liez le contenu de l'étiquette à la propriété Text de la zone de liste déroulante.

  3. Définissez l'opacité de la zone de liste déroulante sur zéro, Opacité = 0.

  4. Écrire le texte par défaut dans la propriété Text de la zone de liste déroulante

          <ComboBox Name="cb"
            Text="--Select Team--" Opacity="0" 
            Height="40" Width="140" >
             <ComboBoxItem Content="Manchester United" />
             <ComboBoxItem Content="Lester" />
         </ComboBox>
     </Grid>
Yinon Dotan
la source
-2

Définissez uniquement l'attribut IsEditable sur true

<ComboBox Name="comboBox1"            
          Text="--Select Team--"
          IsEditable="true"  <---- that's all!
          IsReadOnly="true"/>
Xsan
la source
-3

Je sais que c'est semi-vieux mais qu'en est-il de cette façon:

<DataTemplate x:Key="italComboWM">
    <TextBlock FontSize="11" FontFamily="Segoe UI" FontStyle="Italic" Text="--Select an item--" />
</DataTemplate>

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />
user2638247
la source
2
ComboBoxn'a pas de EmptySelectionBoxTemplatepropriété.
Novitchi S