Wie wird der Standardtext "- Team auswählen -" im Kombinationsfeld beim Laden von Seiten in WPF angezeigt?

109

In einer WPF-App, in einer MVP-App, habe ich ein Kombinationsfeld, für das ich die aus der Datenbank abgerufenen Daten anzeige. Vor den Elementen, die dem Kombinationsfeld hinzugefügt wurden, möchte ich den Standardtext anzeigen, z

" -- Team auswählen --"

Damit beim Laden der Seite und beim Auswählen der Text gelöscht und die Elemente angezeigt werden.

Die Auswahl von Daten aus der Datenbank erfolgt. Ich muss den Standardtext anzeigen, bis der Benutzer ein Element aus dem Kombinationsfeld auswählt.

Bitte führen Sie mich

user301016
quelle

Antworten:

106

Der einfachste Weg, dies zu tun, ist:

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

Sie müssen natürlich Ihre anderen Optionen hinzufügen, aber dies ist wahrscheinlich der einfachste Weg, dies zu tun.

Diese Methode hat jedoch einen Nachteil: Der Text in Ihrem Kombinationsfeld kann zwar nicht bearbeitet werden, ist aber dennoch auswählbar. Angesichts der schlechten Qualität und Komplexität jeder Alternative, die ich bisher gefunden habe, ist dies wahrscheinlich die beste Option auf dem Markt.

Chris Walter
quelle
Tolle Antwort Chris! Ich würde nur Focusable = "True" hinzufügen, aber das ist nur eine kosmetische Veränderung.
Slavisa
6
perfekte Antwort Chris. Eine Eigenschaft kann einen so großen Unterschied machen: D
Aster Veigas
4
Focusable="False" IsEditable="True" IsReadOnly="True"
Kamil Lelonek
1
+1. Leider funktioniert es nicht mit gemischten Elementen (z. B. wenn Combobox-Elemente Bilder sind).
Greenoldman
11
Einfache und funktionierende Lösung. WPF-Steuerelemente haben diese Art von Problemen im gesamten Framework. Hier und da fehlen Steuerelementen Funktionen, die die meisten Entwickler benötigen würden. Infolgedessen verschwenden Entwickler ihre Zeit damit, nach Lösungen zu suchen, alternative Steuerelemente von Drittanbietern zu kaufen oder Problemumgehungen zu implementieren ... Verwendet das WPF-Team ihre Steuerelemente überhaupt für ihre eigenen Entwicklungen?
Verdammtes Gemüse
90

Sie können dies ohne Code tun, indem Sie a verwenden IValueConverter.

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

Hier haben Sie die Konverterklasse, die Sie wiederverwenden können.

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
}

Und schließlich müssen Sie Ihren Konverter in einem Ressourcenabschnitt deklarieren.

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

Wo Konverter ist der Ort, an dem Sie die Konverterklasse platziert haben. Ein Beispiel ist:

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

Das sehr Schöne an diesem Ansatz ist, dass sich der Code in Ihrem Code nicht wiederholt.

Tri Q Tran
quelle
Ich würde dies gerne verwenden, aber es scheint nicht erlaubt zu sein, wenn die Combobox der Header eines Datagrids ist. . . XAML gibt einen Fehler aus, dass der Header bereits definiert ist (oder möglicherweise nicht mehr als einmal definiert werden kann). Irgendwelche Ideen? Ich denke nur daran, eine Nullwertoption zu verwenden, die dann ein Zurücksetzen durch Auswahl ermöglicht, aber ein wenig schlampig erscheint.
Paul Gibson
1
Ein wichtiger Grund, warum dies eine hervorragende Lösung ist, ist, dass fast jedes datengebundene WPF-Projekt einen NullToVisibilityConverter verwendet, sodass er die meiste Zeit bereits vorhanden ist - könnte ihn genauso gut nutzen!
tpartee
2
Eigentlich können Sie DataTriggerhier sogar den Konvertercode vermeiden :)
Billy ONeal
49

Ich mag die Antwort von Tri Q, aber diese Wertekonverter sind schwierig zu bedienen. PaulB hat es mit einem Event-Handler gemacht, aber das ist auch unnötig. Hier ist eine reine XAML-Lösung:

<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
quelle
33

Niemand sagte, eine reine Xaml-Lösung müsse kompliziert sein. Hier ist eine einfache mit 1 Datenauslöser im Textfeld. Rand und Position wie gewünscht

<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
quelle
5
Ich musste "Visibility =" Hidden "in den Datenauslöser verschieben. Dann funktionierte es wie erwartet. Auf jeden Fall der geradlinigste Ansatz, den ich je gesehen habe. Aus Gründen der Wiederverwendbarkeit habe ich den Stil in eine Ressource verschoben
Mitch
Die Antwort von @Mitch IceForce funktioniert bei mir nicht. Was haben Sie geändert, damit es funktioniert?
Chris
1
@ Chris Ich denke, er meinte, <Setter Property="Visibility" Value="Hidden"/>außerhalb des Auslösers (innerhalb des Stils) hinzuzufügen und Visibility="Hidden"aus dem eigentlichen Textblock-Element zu entfernen
Monica wieder herstellen Bitte
@Mitch, wie verschiebt man den Textblock-Stil zur Wiederverwendung in eine Ressource, wenn der Elementname im DataTrigger auf ein bestimmtes Objekt (mybox) verweist? Gibt es eine Möglichkeit, diesen Namen generisch anzugeben?
CrApHeR
23

Setzen Sie IsEditable="True"auf das ComboBoxElement. Dies zeigt die TextEigenschaft von ComboBox.

Meduse
quelle
2
Dies ist die einfachste Lösung aus dem ganzen Los.
Sergey Koulikov
6
es ändert sich jedoch, wie das Steuerelement aussieht
simonalexander2005
16

Ich weiß nicht, ob es direkt unterstützt wird, aber Sie könnten die Kombination mit einer Beschriftung überlagern und sie auf versteckt setzen, wenn die Auswahl nicht null ist.

z.B.

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

Dann in der Auswahl Handler geändert ...

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    txtSelectTeam.Visibility = comboBox1.SelectedItem == null ? Visibility.Visible : Visibility.Hidden;
}
PaulB
quelle
1
Anstatt einen SelectionChanged-Handler zu erstellen, kann die Sichtbarkeit des TextBlocks in XAML festgelegt werden.
Aliceraunsbaek
6

Basierend auf der Antwort von IceForge ich eine wiederverwendbare Lösung vorbereitet:

XAML-Stil:

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

Anwendungsbeispiel:

<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>
auch
quelle
Nett. Ich habe es erweitert, indem ich den DataContext des TextBlocks mit einer relativen Quelle gebunden habe, um zu vermeiden, dass der Name festgelegt werden muss. Siehe den nächsten Kommentar für Markup (Code in SOs Kommentaren sieht hässlich aus)
Sascha
<TextBlock DataContext = "{Binding Path = Children [0] .SelectedItem, RelativeSource = {RelativeSource AncestorType = Grid}}" Text = "- Projekt auswählen -" Style = "{StaticResource ComboBoxSelectOverlay}" />
Sascha
4

Ich habe es nicht mit Kombinationsfeldern versucht, aber das hat bei mir mit anderen Steuerelementen funktioniert ...

ageektrapped Blogpost

Er verwendet die Adorner-Ebene hier, um ein Wasserzeichen anzuzeigen.

Crippeoblade
quelle
Habe gerade diesen Code heruntergeladen und ausprobiert. Es scheint wie angekündigt zu funktionieren. Ermöglicht es Ihnen, Ihre Combo mit einer einfachen Eigenschaft zu dekorieren, die Ihr Wasserzeichen enthält. Es funktioniert auch für andere Steuerelemente. Es ist ein viel besserer Ansatz als jede andere Antwort auf diese Frage.
Ian Oakes
Gutes Zeug, es löst nicht nur das ComboBox-Problem, sondern jetzt kann ich die WPF Tools-Assembly loswerden und diese auch auf meinen TextBoxen anstelle des WatermarkedTextBox-Steuerelements verwenden, also voller Gewinn :) - Oh, übrigens, es ist A Geek Trapped not Vereinbarte Falle!
Dain
2

Die Lösung von HappyNomad war sehr gut und hat mir geholfen, diese etwas andere Lösung zu finden.

<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
quelle
2

Am einfachsten ist es, CompositeCollection zu verwenden, um Standardtext und -daten aus der Datenbank direkt in ComboBox zusammenzuführen, z

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

Definieren Sie in Resources StaticResource, um ComboBox-Optionen an Ihren DataContext zu binden, da die direkte Bindung in CollectionContainer nicht ordnungsgemäß funktioniert.

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

Auf diese Weise können Sie Ihre ComboBox-Optionen nur in xaml definieren, z

   <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
quelle
1

Ich würde folgendes empfehlen:

Definieren Sie ein Verhalten

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;
        }
    }
}

Benutzer das Verhalten

<ComboBox Name="cmb" Margin="72,121,0,0" VerticalAlignment="Top"
          local:ComboBoxBehaviors.DefaultText="-- Select Team --"/>
Usman Zafar
quelle
Dies funktioniert wie ein Zauber für ein einzelnes Kombinationsfeld. Wenn ich es jedoch mit mehr als einer Kombination verwende, wird ein Fehler angezeigt (der jedoch kompiliert und ordnungsgemäß ausgeführt wird). "'DefaultText' -Eigenschaft, die bereits von 'ComboBox' registriert wurde". Ich habe das Update in meinem Blog erwähnt.
Romesh D. Niriella
Vielen Dank für den Hinweis. Ich konnte diesen Fehler auf meinem Computer nicht erzeugen. Ich bin jedoch damit einverstanden, dass typeof (ComboBoxBehaviors) im 3. Parameter von RegisterAttached anstelle von typeof (ComboBox) übergeben werden sollte.
Usman Zafar
Obwohl dieser Beitrag etwas alt ist, sehe ich nicht, wie es funktionieren kann. Das BG der Combo wird über Trigger mit mehreren Bedingungen eingestellt. Versuchen Sie, eine Combo alleine in einem Raster zu platzieren und bg manuell auf 'rot' zu setzen. Dies hat keine Auswirkung auf den Bereich, in dem ein Wasserzeichen angezeigt werden soll. Dies wirkt sich möglicherweise nur auf den Hintergrund hinter dem Dropdown-Feld aus. Eine bessere Lösung besteht darin, die Steuerungsvorlage der Combobox zu kopieren und einige Trigger und Stile hinzuzufügen, um einen visuellen Pinsel, der aus einem Textblock besteht, in den Hintergrund des Rahmens zu malen.
Newclique
1

Die Antwort von IceForge war ziemlich nah und AFAIK ist die einfachste Lösung für dieses Problem. Aber es hat etwas verpasst, da es nicht funktioniert hat (zumindest für mich wird der Text nie angezeigt).

Am Ende können Sie die Eigenschaft "Sichtbarkeit" des TextBlocks nicht einfach auf "Versteckt" setzen, damit sie ausgeblendet wird, wenn das ausgewählte Element des Kombinationsfelds nicht null ist. Sie müssen es standardmäßig so einstellen (da Sie nicht überprüfen können, ob Trigger nicht null sind , indem Sie einen Setter in XAML an derselben Stelle wie die Trigger verwenden.

Hier ist die tatsächliche Lösung basierend auf seiner, wobei der fehlende Setter direkt vor den Auslösern platziert wird:

<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
quelle
1

EDIT: Laut Kommentar unten ist dies keine Lösung. Ich bin mir nicht sicher, wie es funktioniert hat und kann das Projekt nicht überprüfen.

Es ist Zeit, diese Antwort für die neueste XAML zu aktualisieren.

Als ich diese SO-Frage fand, die nach einer Lösung für diese Frage suchte, stellte ich fest, dass die aktualisierte XAML-Spezifikation eine einfache Lösung bietet.

Ein Attribut namens "Platzhalter" ist jetzt verfügbar, um diese Aufgabe auszuführen. So einfach ist das (in 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
quelle
Ich habe diese Lösung verwendet - möchte der negative Wähler näher darauf eingehen? Zugegeben, ich bin kein XAML-Experte, aber es hat funktioniert.
Robb Sadler
1
Obwohl ich nicht der Abstimmungswähler bin, stelle ich mir vor, dass Sie abgelehnt wurden, weil es PlaceholderTextin der System.Windows.ComboBoxKlasse kein Eigentum gibt . Dies ist eine Frage zu WPF, nicht zu WinForms.
Sheridan
Mann, das ist komisch - ich weiß, dass ich an einer XAML-App gearbeitet habe, und ich weiß, dass ich das gerade entdeckt und gesehen habe, wie es funktioniert. Vielleicht war eine Erweiterung im Projekt enthalten? IDK - Ich habe seitdem nachgesehen und sicher gibt es keinen Platzhalter in ComboBox. Ich kann nicht zu dem Projekt zurückkehren, an dem ich gearbeitet habe - alter Kunde. Pfui.
Robb Sadler
2
Sie liegen nicht falsch, aber das ist nicht für WPF. UWP ComboBox hat dies, siehe diese Seite: msdn.microsoft.com/en-us/library/windows/apps/…
laishiekai
0

Nicht die beste Vorgehensweise ... aber funktioniert gut ...

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

Code dahinter

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.
quelle
0

Ich glaube, ein Wasserzeichen, wie in diesem Beitrag erwähnt, würde in diesem Fall gut funktionieren

Es wird ein bisschen Code benötigt, aber Sie können ihn für jede Combobox oder Textbox (und sogar für Passwortboxen) wiederverwenden, daher bevorzuge ich diesen Weg

FearlessHyena
quelle
0

Ich verwende eine IsNullConverter-Klasse in meinem Projekt und es hat bei mir funktioniert. Hier ist der Code dafür in c #. Erstellen Sie einen Ordner mit dem Namen Converter und fügen Sie diese Klasse in diesen Ordner ein, da der verwendete Trigger keinen Wert für statt null unterstützt, und IsNullConverter tut dies einfach

 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.");
    }
}

Fügen Sie den Namespace wie folgt in die xaml-Datei ein.

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

meint

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

Verwenden Sie diese Zeile unter den Ressourcen, um sie über den XAML-Code verfügbar zu machen

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

Hier ist der XAML-Code. Ich habe hier den Auslöser verwendet. Wenn also ein Element in der Combobox ausgewählt wird, wird die Sichtbarkeit Ihres Textes falsch.

<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
quelle
0

// XAML-Code

// ViewModel-Code

    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
quelle
0

Ein bisschen spät aber ..

Eine einfachere Möglichkeit wäre, der Liste ein Dummy-Datenelement mit dem Parameter IsDummy = true hinzuzufügen und sicherzustellen, dass es nicht HitTestVisable ist und eine Höhe von 1 Pixel (mithilfe eines Konverters) aufweist, damit es nicht angezeigt wird.

Registrieren Sie sich dann einfach bei SelectionChanged und setzen Sie darin den Index auf den Dummy-Elementindex.

Es funktioniert wie ein Zauber und auf diese Weise können Sie sich nicht mit dem Stil und den Farben der ComboBox oder Ihrem Anwendungsthema anlegen.

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

Der obige Code zeigt den einfachsten Weg, dies zu erreichen. Deklarieren Sie nach dem Laden des Fensters den Text der Combobox mithilfe der .Text-Eigenschaft der Combobox. Dies kann auch auf DatePicker, Textbox und andere Steuerelemente erweitert werden.

Ketan Dubey
quelle
0

Ich habe es getan, bevor ich die Combobox mit Daten aus der Datenbank in Codebehind wie folgt verbunden habe -

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
Atiq Baqi
quelle
1
Dadurch wird nur der Text als Option in die Dropdown-Liste eingefügt. Das verlangte das OP nicht.
Dean Friedland
Es geht darum, Standardtext hinzuzufügen, und ich habe es auf diese Weise gemacht
Atiq Baqi
0
  1. Bringen Sie ein Etikett auf der Combobox an.

  2. Binden Sie den Inhalt des Etiketts an die Eigenschaft Combobox Text.

  3. Setzen Sie die Deckkraft der Combobox auf Null, Deckkraft = 0.

  4. Schreiben Sie Standardtext in die Eigenschaft Combobox Text

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

Setzen Sie das IsEditable-Attribut nur auf true

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

Ich weiß, dass dies halb alt ist, aber was ist mit diesem Weg:

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

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />
user2638247
quelle
2
ComboBoxhat kein EmptySelectionBoxTemplateEigentum.
Novitchi S