Bagaimana cara menampilkan teks default "--Pilih Tim -" di kotak kombo pada pageload di WPF?

109

Di aplikasi WPF, di aplikasi MVP, saya memiliki kotak kombo, tempat saya menampilkan data yang diambil dari Database. Sebelum item ditambahkan ke kotak kombo, saya ingin menampilkan teks default seperti

"- Pilih Tim -"

sehingga pada pageload itu ditampilkan dan saat memilihnya teks harus dihapus dan item harus ditampilkan.

Sedang memilih data dari DB. Saya perlu menampilkan teks default sampai pengguna memilih item dari kotak kombo.

mohon bimbingannya

pengguna301016
sumber

Jawaban:

107

Cara termudah yang saya temukan untuk melakukan ini adalah:

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

Anda jelas perlu menambahkan opsi lain, tetapi ini mungkin cara termudah untuk melakukannya.

Namun ada satu kelemahan dari metode ini yaitu meskipun teks di dalam kotak kombo Anda tidak dapat diedit, itu masih dapat dipilih. Namun, mengingat kualitas dan kompleksitas yang buruk dari setiap alternatif yang saya temukan hingga saat ini, ini mungkin pilihan terbaik yang ada.

Chris Walter
sumber
Jawaban yang bagus Chris! Saya hanya akan menambahkan Focusable = "True", tapi itu hanya perubahan kosmetik.
Slavisa
6
jawaban sempurna Chris. Satu properti dapat melakukan perbedaan besar: D
Aster Veigas
4
Focusable="False" IsEditable="True" IsReadOnly="True"
Kamil Lelonek
1
+1. Sayangnya itu tidak berfungsi dengan item campuran (misalnya jika item kotak kombo adalah gambar).
greenoldman
11
Solusi sederhana dan berhasil. Kontrol WPF memiliki masalah semacam ini di seluruh kerangka kerja. Di sana-sini, kontrol kehilangan fitur yang dibutuhkan sebagian besar pengembang. Akibatnya, pengembang membuang-buang waktu mereka mencari solusi, membeli kontrol alternatif pihak ketiga, atau menerapkan solusi ... Apakah tim WPF bahkan menggunakan kontrol mereka untuk pengembangan mereka sendiri?
Sayuran Sial
90

Anda dapat melakukan ini tanpa kode apa pun dengan menggunakan file IValueConverter.

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

Di sini Anda memiliki kelas konverter yang dapat Anda gunakan kembali.

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
}

Dan terakhir, Anda perlu mendeklarasikan konverter Anda di bagian resource.

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

Di mana Pengonversi adalah tempat Anda menempatkan kelas konverter. Contohnya adalah:

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

Hal yang sangat menyenangkan tentang pendekatan ini adalah tidak ada pengulangan kode dalam kode Anda.

Tri Q Tran
sumber
Saya ingin menggunakan ini, tetapi tampaknya itu tidak diperbolehkan dalam kasus-kasus bahwa kotak kombo adalah header dari datagrid. . . XAML memberikan kesalahan bahwa header sudah ditentukan (atau mungkin tidak dapat didefinisikan lebih dari sekali). Ada ide? Saya hanya berpikir untuk menggunakan opsi nilai nol, yang kemudian akan memungkinkan penyetelan ulang dengan memilihnya, tetapi tampaknya sedikit ceroboh.
Paul Gibson
1
Alasan besar mengapa ini adalah solusi yang sangat baik adalah karena hampir setiap proyek WPF yang terikat data menggunakan NullToVisibilityConverter sehingga sebagian besar sudah ada di sana - sebaiknya manfaatkan!
tpartee
2
Sebenarnya Anda dapat menggunakan a DataTriggeruntuk menghindari bahkan kode konverter di sini :)
Billy ONeal
49

Saya suka jawaban Tri Q, tetapi konverter nilai itu sulit digunakan. PaulB melakukannya dengan event handler, tapi itu juga tidak perlu. Inilah solusi XAML murni:

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

Tidak ada yang bilang larutan xaml murni harus rumit. Ini yang sederhana, dengan 1 pemicu data di kotak teks. Margin dan posisi sesuai keinginan

<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
sumber
5
Saya perlu memindahkan "Visibilitas =" Tersembunyi "ke dalam pemicu data. Lalu berfungsi seperti yang diharapkan. Jelas pendekatan paling lurus ke depan yang pernah saya lihat. Untuk dapat digunakan kembali, saya memindahkan gaya ke sumber daya
Mitch
Jawaban @Mitch IceForce tidak berfungsi untuk saya, apa yang Anda ubah agar berfungsi?
Chris
1
@ Chris Saya pikir dia berarti menambah <Setter Property="Visibility" Value="Hidden"/>luar pelatuk (dalam gaya) dan menghapus Visibility="Hidden"dari elemen textblock yang sebenarnya
mengembalikan Monica Silakan
@Mitch, bagaimana Anda memindahkan gaya Textblock ke sumber daya untuk digunakan kembali jika Anda memiliki ElementName di DataTrigger yang mengarah ke objek tertentu (kotak saya)? Apakah ada cara untuk menentukan nama itu dengan cara yang umum?
CrApHeR
24

Set IsEditable="True"pada ComboBoxelemen. Ini akan menampilkan Textproperti dari ComboBox.

medusa
sumber
2
Ini adalah solusi paling sederhana dari keseluruhan lot.
Sergey Koulikov
6
itu memang mengubah seperti apa kontrol itu
simonalexander2005
16

Saya tidak tahu apakah itu didukung secara langsung tetapi Anda dapat melapisi kombo dengan label dan mengaturnya ke tersembunyi jika pilihannya tidak null.

misalnya.

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

Kemudian dalam pemilihan berubah penangan ...

private void comboBox1_SelectionChanged(object sender, SelectionChangedEventArgs e)
{
    txtSelectTeam.Visibility = comboBox1.SelectedItem == null ? Visibility.Visible : Visibility.Hidden;
}
PaulB
sumber
1
Alih-alih membuat penangan SelectionChanged, visibilitas TextBlock bisa disetel di XAML.
aliceraunsbaek
6

Berdasarkan jawaban IceForge, saya menyiapkan solusi yang dapat digunakan kembali:

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

contoh penggunaan:

<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>
terlalu
sumber
Bagus. Saya telah memperluasnya dengan mengikat TextBlock's DataContext menggunakan sumber relatif untuk menghindari harus mengatur nama. Lihat komentar berikutnya untuk Markup (kode di komentar SO terlihat jelek)
Sascha
<TextBlock DataContext = "{Binding Path = Children [0] .SelectedItem, RelativeSource = {RelativeSource AncestorType = Grid}}" Text = "- Select Project -" Style = "{StaticResource ComboBoxSelectOverlay}" />
Sascha
4

Belum mencobanya dengan kotak kombo tetapi ini berhasil untuk saya dengan kontrol lain ...

ageektrapped blogpost

Dia menggunakan lapisan penghias di sini untuk menampilkan tanda air.

Crippeoblade
sumber
Baru saja mengunduh dan mencoba kode ini. Tampaknya berfungsi seperti yang diiklankan. Memungkinkan Anda untuk menghias kombo Anda dengan properti terlampir sederhana yang berisi tanda air Anda. Ini juga berfungsi untuk kontrol lain juga. Ini adalah pendekatan yang jauh lebih baik daripada jawaban lain untuk pertanyaan ini.
Ian Oakes
Bagus, tidak hanya itu memecahkan masalah ComboBox, tetapi sekarang saya dapat menyingkirkan rakitan Alat WPF dan hanya menggunakan ini di TextBoxes saya alih-alih kontrol WatermarkedTextBox juga, sangat penuh dengan kemenangan :) - oh btw itu A Geek Trapped not Perangkap Setuju!
dain
2

Solusi HappyNomad sangat bagus dan membantu saya pada akhirnya mendapatkan solusi yang sedikit berbeda ini.

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

Cara termudah adalah dengan menggunakan CompositeCollection untuk menggabungkan teks default dan data dari database secara langsung di ComboBox mis.

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

Dan di Resources, tentukan StaticResource untuk mengikat opsi ComboBox ke DataContext Anda, karena pengikatan langsung di CollectionContainer tidak berfungsi dengan benar.

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

Dengan cara ini Anda dapat menentukan opsi ComboBox Anda hanya di xaml mis

   <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>
Pertengkaran
sumber
1

Saya akan merekomendasikan yang berikut ini:

Tentukan perilaku

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

Gunakan perilakunya

<ComboBox Name="cmb" Margin="72,121,0,0" VerticalAlignment="Top"
          local:ComboBoxBehaviors.DefaultText="-- Select Team --"/>
Usman Zafar
sumber
Ini bekerja seperti pesona untuk satu kotak kombo. Tetapi ketika saya menggunakannya dengan lebih dari 1 combo, itu memberi saya kesalahan (tapi mengkompilasi dan berjalan dengan baik) "Properti 'DefaultText' sudah terdaftar oleh 'ComboBox'". Saya telah menyebutkan perbaikannya di blog saya.
Romesh D. Niriella
Terima kasih telah menunjukkan hal ini. Saya tidak dapat menghasilkan kesalahan ini di komputer saya. Namun, saya setuju typeof (ComboBoxBehaviors) harus diteruskan dalam parameter ke-3 RegisterAttached, bukan typeof (ComboBox).
Usman Zafar
Meskipun posting ini agak lama, saya tidak melihat bagaimana ini bisa bekerja. Bg kombo diatur melalui pemicu dengan beberapa kondisi. Coba tempatkan kombo saja di petak dan atur bg secara manual ke 'merah'. Ini tidak berpengaruh pada area di mana Anda ingin tanda air muncul. Ini hanya dapat mempengaruhi bg di belakang panel dropdown. Solusi yang lebih baik adalah menyalin template kontrol kotak kombo dan menambahkan beberapa pemicu dan gaya untuk melukis kuas visual yang terdiri dari blok teks ke latar belakang perbatasan.
Newclique
1

Jawaban IceForge cukup dekat, dan AFAIK adalah solusi termudah untuk masalah ini. Tapi itu melewatkan sesuatu, karena tidak berfungsi (setidaknya bagi saya, itu tidak pernah benar-benar menampilkan teks).

Pada akhirnya, Anda tidak bisa begitu saja menyetel properti "Visibilitas" dari TextBlock ke "Tersembunyi" agar bisa disembunyikan ketika item yang dipilih kotak kombo tidak null; Anda harus MENYETELnya seperti itu secara default (karena Anda tidak dapat memeriksa tidak null di pemicu , dengan menggunakan Setter di XAML di tempat yang sama dengan Pemicu.

Inilah solusi sebenarnya berdasarkan miliknya, Setter yang hilang ditempatkan tepat sebelum Pemicu:

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

EDIT: Per komentar di bawah, ini bukan solusi. Tidak yakin bagaimana saya membuatnya berfungsi, dan tidak dapat memeriksa proyek itu.

Saatnya memperbarui jawaban ini untuk XAML terbaru.

Menemukan pertanyaan SO ini mencari solusi untuk pertanyaan ini, saya kemudian menemukan bahwa spesifikasi XAML yang diperbarui memiliki solusi sederhana.

Atribut yang disebut "Placeholder" sekarang tersedia untuk menyelesaikan tugas ini. Ini sesederhana ini (dalam 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
sumber
Saya menggunakan solusi ini - apakah pemilih negatif peduli untuk menjelaskannya? Memang saya bukan ahli XAML, tetapi berhasil.
Robb Sadler
1
Meskipun saya bukan pemilih bawah, saya membayangkan Anda mendapat suara rendah karena tidak ada PlaceholderTextproperti di System.Windows.ComboBoxkelas . Ini adalah pertanyaan tentang WPF, bukan WinForms.
Sheridan
Sobat ini aneh - Saya tahu saya sedang mengerjakan aplikasi XAML, dan saya tahu saya baru saja menemukan ini dan melihatnya berhasil. Mungkin perpanjangan disertakan dalam proyek? IDK - Saya telah mencari dan pasti tidak ada Placeholder di ComboBox. Saya tidak bisa kembali ke proyek yang saya kerjakan - klien lama. ugh.
Robb Sadler
2
Anda tidak salah, tapi itu bukan untuk WPF. UWP ComboBox memiliki ini, silakan lihat halaman ini: msdn.microsoft.com/en-us/library/windows/apps/…
laishiekai
0

Bukan praktik terbaik..tapi berfungsi dengan baik ...

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

Kode di belakang

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

Saya percaya tanda air seperti yang disebutkan dalam posting ini akan berfungsi dengan baik dalam kasus ini

Ada sedikit kode yang diperlukan tetapi Anda dapat menggunakannya kembali untuk combobox atau kotak teks (dan bahkan kotak kata sandi) jadi saya lebih suka cara ini

Tak kenal takut, Hyena
sumber
0

Saya menggunakan kelas IsNullConverter dalam proyek saya dan itu berhasil untuk saya. berikut adalah kode untuk itu di c #, buat folder bernama Konverter dan tambahkan kelas ini di folder itu, karena pemicu yang digunakan tidak mendukung nilai daripada null, dan IsNullConverter lakukan saja

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

tambahkan namespace dalam file xaml seperti ini.

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

cara

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

gunakan baris ini di bawah sumber daya untuk membuatnya tersedia melalui kode xaml

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

di sini adalah kode xaml, saya digunakan di sini pemicu sehingga setiap kali item dipilih di kotak kombo, visibilitas teks Anda menjadi salah.

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

// Kode XAML

// Kode 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
sumber
0

Sedikit terlambat tapi ..

Cara yang lebih sederhana adalah dengan menambahkan item data dummy ke daftar dengan parameter IsDummy = true dan pastikan itu bukan HitTestVisable dan tingginya 1 piksel (menggunakan Konverter) sehingga tidak akan terlihat.

Dari sekedar mendaftar ke SelectionChanged dan di dalamnya, setel indeks ke indeks item dummy.

Ini berfungsi seperti pesona dan dengan cara ini Anda tidak mengacaukan gaya dan warna ComboBox atau tema aplikasi Anda.

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

Kode di atas menunjukkan cara termudah untuk mencapainya. Setelah jendela dimuat, nyatakan teks kotak kombo, menggunakan properti .Text kotak kombo. Ini dapat diperluas ke DatePicker, Textbox, dan kontrol lainnya juga.

Ketan Dubey
sumber
0

Saya melakukannya sebelum mengikat kotak kombo dengan data dari database di belakang kode seperti ini -

Combobox.Items.Add("-- Select Team --");
Combobox.SelectedIndex = 0;
Atiq Baqi
sumber
1
Ini hanya menambahkan teks sebagai opsi di dropdown. Bukan itu yang diminta OP.
Dean Friedland
ini tentang menambahkan teks default dan saya melakukannya dengan cara ini
Atiq Baqi
0
  1. Beri label di atas kotak kombo.

  2. Ikat konten label ke properti Teks kotak kombo.

  3. Atur opacity kotak kombo menjadi nol, Opacity = 0.

  4. Tulis teks default di properti Teks kotak kombo

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

Hanya setel atribut IsEditable ke true

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

Saya tahu ini agak tua tetapi bagaimana dengan cara ini:

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

<ComboBox EmptySelectionBoxTemplate="{StaticResource italComboWM}" />
pengguna2638247
sumber
2
ComboBoxtidak memiliki EmptySelectionBoxTemplateproperti.
Novitchi S