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
Focusable="False" IsEditable="True" IsReadOnly="True"
Anda dapat melakukan ini tanpa kode apa pun dengan menggunakan file
IValueConverter
.Di sini Anda memiliki kelas konverter yang dapat Anda gunakan kembali.
Dan terakhir, Anda perlu mendeklarasikan konverter Anda di bagian resource.
Di mana Pengonversi adalah tempat Anda menempatkan kelas konverter. Contohnya adalah:
Hal yang sangat menyenangkan tentang pendekatan ini adalah tidak ada pengulangan kode dalam kode Anda.
sumber
DataTrigger
untuk menghindari bahkan kode konverter di sini :)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:
sumber
Tidak ada yang bilang larutan xaml murni harus rumit. Ini yang sederhana, dengan 1 pemicu data di kotak teks. Margin dan posisi sesuai keinginan
sumber
<Setter Property="Visibility" Value="Hidden"/>
luar pelatuk (dalam gaya) dan menghapusVisibility="Hidden"
dari elemen textblock yang sebenarnyaSet
IsEditable="True"
padaComboBox
elemen. Ini akan menampilkanText
properti dariComboBox
.sumber
Saya tidak tahu apakah itu didukung secara langsung tetapi Anda dapat melapisi kombo dengan label dan mengaturnya ke tersembunyi jika pilihannya tidak null.
misalnya.
Kemudian dalam pemilihan berubah penangan ...
sumber
Berdasarkan jawaban IceForge, saya menyiapkan solusi yang dapat digunakan kembali:
gaya xaml:
contoh penggunaan:
sumber
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.
sumber
Solusi HappyNomad sangat bagus dan membantu saya pada akhirnya mendapatkan solusi yang sedikit berbeda ini.
sumber
Cara termudah adalah dengan menggunakan CompositeCollection untuk menggabungkan teks default dan data dari database secara langsung di ComboBox mis.
Dan di Resources, tentukan StaticResource untuk mengikat opsi ComboBox ke DataContext Anda, karena pengikatan langsung di CollectionContainer tidak berfungsi dengan benar.
Dengan cara ini Anda dapat menentukan opsi ComboBox Anda hanya di xaml mis
sumber
Saya akan merekomendasikan yang berikut ini:
Tentukan perilaku
Gunakan perilakunya
sumber
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:
sumber
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):
sumber
PlaceholderText
properti diSystem.Windows.ComboBox
kelas . Ini adalah pertanyaan tentang WPF, bukan WinForms.Bukan praktik terbaik..tapi berfungsi dengan baik ...
Kode di belakang
sumber
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
sumber
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
tambahkan namespace dalam file xaml seperti ini.
cara
gunakan baris ini di bawah sumber daya untuk membuatnya tersedia melalui kode xaml
di sini adalah kode xaml, saya digunakan di sini pemicu sehingga setiap kali item dipilih di kotak kombo, visibilitas teks Anda menjadi salah.
sumber
// Kode XAML
// Kode ViewModel
sumber
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.
sumber
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.
sumber
Saya melakukannya sebelum mengikat kotak kombo dengan data dari database di belakang kode seperti ini -
sumber
Beri label di atas kotak kombo.
Ikat konten label ke properti Teks kotak kombo.
Atur opacity kotak kombo menjadi nol, Opacity = 0.
Tulis teks default di properti Teks kotak kombo
sumber
Hanya setel atribut IsEditable ke true
sumber
Saya tahu ini agak tua tetapi bagaimana dengan cara ini:
sumber
ComboBox
tidak memilikiEmptySelectionBoxTemplate
properti.