Jak wyświetlić domyślny tekst „--Select Team -” w polu kombi podczas ładowania strony w WPF?

109

W aplikacji WPF, w aplikacji MVP, mam pole kombi, dla którego wyświetlam dane pobrane z Bazy Danych. Przed elementami dodanymi do pola Combo chcę wyświetlić domyślny tekst, taki jak

" -- Wybierz drużynę --"

aby po załadowaniu strony wyświetlił się i po wybraniu go tekst powinien zostać wyczyszczony, a pozycje powinny zostać wyświetlone.

Trwa wybieranie danych z DB. Muszę wyświetlać domyślny tekst, dopóki użytkownik nie wybierze elementu z pola kombi.

Proszę, prowadź mnie

user301016
źródło

Odpowiedzi:

108

Najłatwiejszy sposób, jaki znalazłem, to:

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

Oczywiście będziesz musiał dodać inne opcje, ale jest to prawdopodobnie najprostszy sposób na zrobienie tego.

Jest jednak jedna wada tej metody, która polega na tym, że tekst w polu kombi nie będzie edytowalny, ale nadal można go wybrać. Jednak biorąc pod uwagę słabą jakość i złożoność każdej alternatywy, którą do tej pory znalazłem, jest to prawdopodobnie najlepsza opcja.

Chris Walter
źródło
Świetna odpowiedź Chris! Dodałbym po prostu Focusable = "True", ale to tylko kosmetyczna zmiana.
Slavisa
6
doskonała odpowiedź Chris. Jedna nieruchomość może zrobić tak dużą różnicę: D
Aster Veigas
4
Focusable="False" IsEditable="True" IsReadOnly="True"
Kamil Lelonek
1
+1. Niestety nie działa to z przedmiotami mieszanymi (na przykład jeśli elementy combobox są obrazami).
greenoldman
11
Proste i działające rozwiązanie. Formanty WPF mają tego rodzaju problemy w całej strukturze. Tu i ówdzie brakuje elementów sterujących, których potrzebowałaby większość programistów. W rezultacie programiści tracą czas na szukanie rozwiązań, kupowanie alternatywnych formantów innych firm lub wdrażanie obejść ... Czy zespół WPF używa ich w ogóle do własnych opracowań?
Damn Vegetables
90

Możesz to zrobić bez żadnego kodu, używając pliku IValueConverter.

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

Tutaj masz klasę konwertera, której możesz ponownie użyć.

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
}

Na koniec musisz zadeklarować swój konwerter w sekcji zasobów.

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

Gdzie Converters to miejsce, w którym umieściłeś klasę konwertera. Oto przykład:

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

Bardzo fajną rzeczą w tym podejściu jest brak powtarzania kodu w kodzie.

Tri Q Tran
źródło
Chciałbym tego użyć, ale wydaje się, że jest to niedozwolone w przypadku, gdy combobox jest nagłówkiem datagridu. . . XAML zgłasza błąd, że nagłówek jest już zdefiniowany (lub być może nie można go zdefiniować więcej niż raz). Jakieś pomysły? Myślę tylko o użyciu opcji wartości zerowej, która pozwoli na reset, wybierając ją, ale wydaje się trochę niechlujna.
Paul Gibson
1
Dużym powodem, dla którego jest to doskonałe rozwiązanie, jest to, że prawie każdy projekt WPF powiązany z danymi korzysta z NullToVisibilityConverter, więc jest on już dostępny przez większość czasu - równie dobrze mógłby z niego skorzystać!
partner
2
Właściwie możesz użyć a, DataTriggeraby uniknąć tutaj nawet kodu konwertera :)
Billy ONeal
49

Podoba mi się odpowiedź Tri Q, ale te konwertery wartości są trudne w użyciu. PaulB zrobił to za pomocą programu obsługi zdarzeń, ale to też jest niepotrzebne. Oto rozwiązanie w czystym języku XAML:

<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
źródło
33

Nikt nie powiedział, że czyste rozwiązanie XAML musi być skomplikowane. Oto prosty, z jednym wyzwalaczem danych w polu tekstowym. Margines i pozycja według potrzeb

<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
źródło
5
Musiałem przenieść opcję „Widoczność =„ Ukryty ”do wyzwalacza danych. Potem zadziałało zgodnie z oczekiwaniami. Zdecydowanie najbardziej proste podejście do przodu, jakie widziałem. Aby umożliwić ponowne użycie, przeniosłem styl do zasobu
Mitch
Odpowiedź @Mitch IceForce nie działa dla mnie, co zmieniłeś, aby działała?
Chris
1
@Chris Myślę, że miał na myśli dodanie <Setter Property="Visibility" Value="Hidden"/>poza wyzwalaczem (wewnątrz stylu) i usunięcie Visibility="Hidden"z rzeczywistego elementu textblock
Przywróć Monikę Proszę,
@Mitch, jak przenieść styl Textblock do zasobu w celu ponownego użycia, jeśli masz element ElementName w DataTrigger wskazujący na określony obiekt (mybox)? Czy istnieje sposób na określenie tej nazwy w sposób ogólny?
CrApHeR
24

Ustaw IsEditable="True"na ComboBoxelemencie. Spowoduje to wyświetlenie Textwłaściwości pliku ComboBox.

meduza
źródło
2
To najprostsze rozwiązanie spośród wszystkich.
Sergey Koulikov
6
zmienia to jednak wygląd sterowania
simonalexander2005
16

Nie wiem, czy jest bezpośrednio obsługiwany, ale możesz nałożyć na kombinację etykietę i ustawić ją jako ukrytą, jeśli wybór nie jest pusty.

na przykład.

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

Następnie w wyborze zmieniono obsługę ...

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    txtSelectTeam.Visibility = comboBox1.SelectedItem == null ? Visibility.Visible : Visibility.Hidden;
}
PaulB
źródło
1
Zamiast tworzyć procedurę obsługi SelectionChanged widoczność TextBlock można ustawić w języku XAML.
aliceraunsbaek
6

Na podstawie odpowiedzi IceForge przygotowałem rozwiązanie wielokrotnego użytku:

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

przykład użycia:

<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>
też
źródło
Miły. Rozszerzyłem go, wiążąc DataContext obiektu TextBlock przy użyciu źródła względnego, aby uniknąć konieczności ustawiania nazwy. Zobacz następny komentarz dotyczący znaczników (kod w komentarzach SO wygląda brzydko)
Sascha
<TextBlock DataContext = "{Binding Path = Children [0] .SelectedItem, RelativeSource = {RelativeSource AncestorType = Grid}}" Text = "- Wybierz projekt -" Style = "{StaticResource ComboBoxSelectOverlay}" />
Sascha
4

Nie próbowałem tego z polami kombi, ale zadziałało to dla mnie z innymi kontrolkami ...

post na blogu ageektrapped

Używa tutaj warstwy adorner, aby wyświetlić znak wodny.

Crippeoblade
źródło
Właśnie pobrałem i wypróbowałem ten kod. Wygląda na to, że działa zgodnie z reklamą. Pozwala ozdobić kombinację prostą dołączoną właściwością zawierającą znak wodny. Działa również z innymi kontrolkami. To znacznie lepsze podejście niż jakiekolwiek inne odpowiedzi na to pytanie.
Ian Oakes
Dobre rzeczy, nie tylko rozwiązuje problem ComboBox, ale teraz mogę pozbyć się zestawu narzędzi WPF i po prostu użyć tego na moich TextBoxach zamiast kontrolki WatermarkedTextBox, tak pełne wygranej :) - och tak btw to nie jest uwięziony geek Uzgodniona pułapka!
Dain
2

Rozwiązanie HappyNomad było bardzo dobre i pomogło mi ostatecznie dojść do tego nieco innego rozwiązania.

<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
źródło
2

Najłatwiejszym sposobem jest użycie CompositeCollection do scalenia domyślnego tekstu i danych z bazy danych bezpośrednio w ComboBox np

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

W Resources zdefiniuj StaticResource, aby powiązać opcje ComboBox z DataContext, ponieważ bezpośrednie powiązanie w CollectionContainer nie działa poprawnie.

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

W ten sposób możesz zdefiniować opcje ComboBox tylko w XAML np

   <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>
Zastrzelić
źródło
1

Polecam:

Zdefiniuj zachowanie

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

Użytkownik zachowanie

<ComboBox Name="cmb" Margin="72,121,0,0" VerticalAlignment="Top"
          local:ComboBoxBehaviors.DefaultText="-- Select Team --"/>
Usman Zafar
źródło
Działa to jak urok dla pojedynczego pola kombi. Ale kiedy używam go z więcej niż 1 kombinacją, daje mi to błąd (ale kompiluje się i działa dobrze) „Właściwość 'DefaultText' już zarejestrowana przez 'ComboBox'”. Wspomniałem o poprawce na moim blogu.
Romesh D. Niriella
Dziękuję za zwrócenie uwagi. Nie mogłem wygenerować tego błędu na moim komputerze. Jednak zgadzam się, że typeof (ComboBoxBehaviors) powinien być przekazany w trzecim parametrze RegisterAttached zamiast typeof (ComboBox).
Usman Zafar
Chociaż ten post jest trochę stary, nie widzę, jak to może działać. Wartość bg kombinacji jest ustawiana za pomocą wyzwalaczy z wieloma warunkami. Spróbuj umieścić combo samodzielnie na siatce i ręcznie ustawić bg na „czerwony”. Nie ma to wpływu na obszar, w którym ma się pojawić znak wodny. Może wpływać tylko na bg za panelem rozwijanym. Lepszym rozwiązaniem jest skopiowanie szablonu kontrolnego combobox i dodanie kilku wyzwalaczy i stylów, aby pomalować wizualny pędzel składający się z bloku tekstu na tle obramowania.
Newclique
1

Odpowiedź IceForge była dość bliska i jest AFAIK najłatwiejszym rozwiązaniem tego problemu. Ale coś przeoczyło, ponieważ nie działało (przynajmniej dla mnie, tak naprawdę nigdy nie wyświetla tekstu).

Ostatecznie nie możesz po prostu ustawić właściwości „Widoczność” TextBlock na „Ukryty”, aby była ona ukryta, gdy element zaznaczony w polu kombi nie jest pusty; musisz ustawić to w ten sposób domyślnie (ponieważ nie możesz sprawdzić wartości Null w wyzwalaczach , używając Setter w XAML w tym samym miejscu co wyzwalacze.

Oto rzeczywiste rozwiązanie oparte na jego, brakujący seter jest umieszczony tuż przed wyzwalaczami:

<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
źródło
1

EDYCJA: Zgodnie z poniższymi komentarzami, to nie jest rozwiązanie. Nie wiem, jak to działa, i nie mogę sprawdzić tego projektu.

Czas zaktualizować tę odpowiedź, aby uzyskać najnowszy kod XAML.

Znajdując to pytanie SO, szukając rozwiązania tego pytania, stwierdziłem, że zaktualizowana specyfikacja XAML ma proste rozwiązanie.

Do wykonania tego zadania jest teraz dostępny atrybut o nazwie „Symbol zastępczy”. To jest tak proste, jak to (w programie 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
źródło
Skorzystałem z tego rozwiązania - czy wyborcy negatywnemu zależy na rozwinięciu? To prawda, że ​​nie jestem ekspertem od XAML, ale zadziałało.
Robb Sadler
1
Chociaż nie jestem wyborcą negatywnym, wyobrażam sobie, że zostałeś przegrany, ponieważ PlaceholderTextw System.Windows.ComboBoxklasie nie ma nieruchomości . To jest pytanie dotyczące WPF, a nie WinForms.
Sheridan,
Człowieku, to dziwne - wiem, że pracowałem nad aplikacją XAML i wiem, że właśnie to odkryłem i zobaczyłem, że działa. Może w projekcie uwzględniono rozszerzenie? IDK - od tego czasu szukałem i na pewno nie ma symbolu zastępczego w ComboBox. Nie mogę wrócić do projektu, nad którym pracowałem - stary klient. ugh.
Robb Sadler
2
Nie mylisz się, ale to nie jest dla WPF. UWP ComboBox ma to, zobacz tę stronę: msdn.microsoft.com/en-us/library/windows/apps/ ...
laishiekai
0

Nie jest to najlepsza praktyka, ale działa dobrze ...

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

Kod za

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.
źródło
0

Uważam, że znak wodny, o którym wspomniano w tym poście, działałby dobrze w tym przypadku

Potrzebny jest trochę kodu, ale możesz go ponownie użyć dla dowolnego pola wielofunkcyjnego lub pola tekstowego (a nawet skrzynek z hasłami), więc wolę ten sposób

NieustraszonyHyena
źródło
0

Używam klasy IsNullConverter w moim projekcie i zadziałało dla mnie. oto kod w języku c #, utwórz folder o nazwie Converter i dodaj tę klasę do tego folderu, ponieważ używany wyzwalacz nie obsługuje wartości for zamiast null, a IsNullConverter po prostu to robi

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

dodaj przestrzeń nazw w pliku XAML w ten sposób.

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

znaczy

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

użyj tej linii poniżej zasobów, aby była dostępna za pośrednictwem kodu XAML

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

tutaj jest kod XAML, użyłem tutaj wyzwalacza, więc za każdym razem, gdy element zostanie wybrany w polu kombi, widoczność tekstu staje się fałszywa.

<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
źródło
0

// Kod XAML

// Kod 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
źródło
0

Trochę późno, ale ...

Prostszym sposobem byłoby dodanie fikcyjnego elementu danych do listy z parametrem IsDummy = true i upewnienie się, że nie jest to HitTestVisable, a jego wysokość wynosi 1 piksel (przy użyciu konwertera), aby nie był widoczny.

Następnie wystarczy zarejestrować się w SelectionChanged i ustawić w nim indeks na fikcyjny indeks pozycji.

Działa jak urok i w ten sposób nie będziesz mieszać ze stylem i kolorami ComboBox lub motywem aplikacji.

Eibi
źródło
0
InitializeComponent()
yourcombobox.text=" -- Select Team --";

Powyższy kod demonstruje najprostszy sposób osiągnięcia tego celu. Po załadowaniu okna zadeklaruj tekst pola kombi, używając właściwości .Text pola kombi. Można to rozszerzyć na DatePicker, Textbox i inne kontrolki.

Ketan Dubey
źródło
0

Zrobiłem to przed powiązaniem combobox z danymi z bazy danych w za kodem w ten sposób -

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
Atiq Baqi
źródło
1
Spowoduje to po prostu dodanie tekstu jako opcji w menu rozwijanym. Nie o to prosił PO.
Dean Friedland,
chodzi o dodanie domyślnego tekstu i zrobiłem to w ten sposób
Atiq Baqi
0
  1. Umieść etykietę na górze pudełka wielofunkcyjnego.

  2. Powiąż zawartość etykiety z właściwością tekstu combobox.

  3. Ustaw krycie combobox na zero, Opacity = 0.

  4. Wpisz tekst domyślny we właściwości Text combobox

          <ComboBox Name="cb"
            Text="--Select Team--" Opacity="0" 
            Height="40" Width="140" >
             <ComboBoxItem Content="Manchester United" />
             <ComboBoxItem Content="Lester" />
         </ComboBox>
     </Grid>
Yinon Dotan
źródło
-2

Ustaw tylko atrybut IsEditable na true

<ComboBox Name="comboBox1"            
          Text="--Select Team--"
          IsEditable="true"  <---- that's all!
          IsReadOnly="true"/>
Xsan
źródło
-3

Wiem, że to jest na wpół stare, ale co z tego:

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

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />
user2638247
źródło
2
ComboBoxnie ma EmptySelectionBoxTemplatewłasności.
Novitchi S