Saya mendapat enum seperti ini:
public enum MyLovelyEnum
{
FirstSelection,
TheOtherSelection,
YetAnotherOne
};
Saya mendapat properti di DataContext saya:
public MyLovelyEnum VeryLovelyEnum { get; set; }
Dan saya mendapat tiga RadioButtons di klien WPF saya.
<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>
Sekarang bagaimana saya mengikat RadioButtons ke properti untuk pengikatan dua arah yang tepat?
Jawaban:
Anda dapat menggunakan konverter yang lebih umum
Dan di XAML-Part yang Anda gunakan:
sumber
Anda selanjutnya dapat menyederhanakan jawaban yang diterima. Alih-alih mengetik enum sebagai string dalam xaml dan melakukan lebih banyak pekerjaan di konverter daripada yang dibutuhkan, Anda dapat secara eksplisit meneruskan nilai enum alih-alih representasi string, dan seperti dikomentari CrimsonX, kesalahan dapat terjadi pada waktu kompilasi alih-alih runtime:
ConverterParameter = {x: Statis lokal: YourEnumType.Enum1}
Kemudian sederhanakan konverter:
Edit (Des 16 '10):
Terima kasih kepada anon untuk menyarankan pengembalian Binding.DoNothing daripada DependencyProperty.UnsetValue.Catatan - Beberapa grup RadioButtons dalam wadah yang sama (17 Feb '11):
Dalam xaml, jika tombol radio berbagi wadah induk yang sama, maka memilih satu akan membatalkan pilihan semua yang lain di dalam wadah itu (bahkan jika mereka terikat pada properti yang berbeda). Jadi cobalah untuk menjaga RadioButton Anda yang terikat pada properti umum yang dikelompokkan bersama dalam wadah mereka sendiri seperti panel tumpukan. Dalam kasus di mana RadioButtons Anda yang terkait tidak dapat membagikan wadah induk tunggal, kemudian tetapkan properti GroupName dari setiap RadioButton ke nilai umum untuk mengelompokkannya secara logis.Edit (5 Apr '11):
ConvertBack Sederhana jika-lain menggunakan Operator Ternary.Catatan - Jenis Enum bersarang di kelas (28 Apr '11):
Jika tipe enum Anda bersarang di kelas (bukan langsung di namespace), Anda mungkin dapat menggunakan sintaks '+' untuk mengakses enum di XAML seperti yang dinyatakan dalam jawaban (tidak ditandai) untuk pertanyaan yang tidak dapat menemukan tipe enum untuk referensi statis di WPF :ConverterParameter = {x: Statis lokal: YourClass + YourNestedEnumType.Enum1}
Karena Masalah Microsoft Connect ini , bagaimanapun, perancang di VS2010 tidak akan lagi memuat pernyataan
"Type 'local:YourClass+YourNestedEnumType' was not found."
, tetapi proyek tersebut mengkompilasi dan berjalan dengan sukses. Tentu saja, Anda dapat menghindari masalah ini jika Anda dapat memindahkan tipe enum Anda ke namespace secara langsung.Edit (27 Jan '12):
Jika menggunakan bendera Enum, konverternya adalah sebagai berikut:Edit (7 Mei '15):
Dalam kasus Nullable Enum (yang tidak ditanyakan dalam pertanyaan, tetapi dapat diperlukan dalam beberapa kasus, misalnya ORM mengembalikan nol dari DB atau kapan pun mungkin masuk akal bahwa dalam logika program nilai tidak diberikan), ingatlah untuk menambahkan pemeriksaan awal nol dalam Metode Konversi dan kembalikan nilai bool yang sesuai, yang biasanya salah (jika Anda tidak ingin tombol radio dipilih), seperti di bawah ini:Catatan - NullReferenceException (10 Okt '18):
Diperbarui contoh untuk menghapus kemungkinan melempar NullReferenceException.IsChecked
adalah jenis yang dapat dibatalkan sehingga mengembalikanNullable<Boolean>
tampaknya merupakan solusi yang masuk akal.sumber
Untuk jawaban EnumToBooleanConverter: Alih-alih mengembalikan DependencyProperty.UnsetValue pertimbangkan untuk mengembalikan Binding. Tidak ada kasus di mana nilai IsChecked tombol radio menjadi false. Yang pertama menunjukkan masalah (dan mungkin menunjukkan pengguna persegi panjang merah atau indikator validasi serupa) sementara yang kedua hanya menunjukkan bahwa tidak ada yang harus dilakukan, yang merupakan apa yang diinginkan dalam kasus itu.
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.convertback.aspx http://msdn.microsoft.com/en-us/library/system.windows.data.binding .donothing.aspx
sumber
Saya akan menggunakan RadioButtons di ListBox, dan kemudian ikat ke SelectedValue.
Ini adalah utas yang lebih lama tentang topik ini, tetapi ide dasarnya harus sama: http://social.msdn.microsoft.com/Forums/en-US/wpf/thread/323d067a-efef-4c9f-8d99-fecf45522395/
sumber
Untuk UWP, itu tidak begitu sederhana: Anda harus melompat melalui lingkaran ekstra untuk melewati nilai bidang sebagai parameter.
Contoh 1
Berlaku untuk WPF dan UWP.
Contoh 2
Berlaku untuk WPF dan UWP.
Contoh 3
Hanya berlaku untuk WPF!
UWP tidak mendukung
x:Static
sehingga Contoh 3 keluar dari pertanyaan; dengan asumsi Anda pergi dengan Contoh 1 , hasilnya adalah kode yang lebih bertele-tele. Contoh 2 sedikit lebih baik, tetapi masih belum ideal.Larutan
Kemudian, untuk setiap jenis yang ingin Anda dukung, tentukan konverter yang mengotak jenis enum.
Alasannya harus kotak adalah karena sepertinya tidak ada cara untuk referensi jenis dalam
ConvertBack
metode ini; tinju menangani itu. Jika Anda menggunakan salah satu dari dua contoh pertama, Anda bisa mereferensikan tipe parameter, menghilangkan keharusan untuk mewarisi dari kelas kotak; jika Anda ingin melakukan semuanya dalam satu baris dan dengan kemungkinan yang paling sedikit, solusi yang terakhir sangat ideal.Penggunaannya menyerupai Contoh 2 , tetapi pada kenyataannya lebih sedikit bertele-tele.
Kelemahannya adalah Anda harus menentukan konverter untuk setiap jenis yang ingin Anda dukung.
sumber
Saya telah membuat kelas baru untuk menangani RadioButtons dan CheckBox yang mengikat ke enum. Ini berfungsi untuk enum yang ditandai (dengan beberapa pilihan kotak centang) dan enum yang tidak ditandai untuk kotak centang pilihan tunggal atau tombol radio. Ini juga tidak memerlukan ValueConverters sama sekali.
Ini mungkin terlihat lebih rumit pada awalnya, namun, setelah Anda menyalin kelas ini ke proyek Anda, selesai. Ini generik sehingga dapat dengan mudah digunakan kembali untuk enum apa pun.
Dan untuk cara menggunakannya, katakanlah Anda memiliki enum untuk menjalankan tugas secara manual atau otomatis, dan dapat dijadwalkan untuk hari apa pun dalam seminggu, dan beberapa opsi opsional ...
Sekarang, inilah betapa mudahnya menggunakan kelas ini:
Dan inilah betapa mudahnya untuk mengikat kotak centang dan tombol radio dengan kelas ini:
sumber
EnumSelection<StartTask>
objek. Jika Anda melihat definisiEnumSelection<T>
Anda dapat melihat bahwa ia memiliki properti Value. Jadi model tampilan tidak perlu memiliki "SelectedStartTask". Anda akan menggunakannyaStartUp.Value
. Dan untuk memiliki nilai default Undefined, lihat enum ke-3, AdditionalOptions, ia memiliki None, bukan Undefined, tetapi Anda dapat mengubah namanya menjadi apa pun yang Anda inginkan.Ini juga berfungsi untuk Kotak Centang .
Mengikat satu enum ke beberapa kotak centang.
sumber
Berdasarkan EnumToBooleanConverter dari Scott. Saya perhatikan bahwa metode ConvertBack tidak berfungsi pada Enum dengan kode flags.
Saya sudah mencoba kode berikut:
Satu-satunya hal yang saya tidak bisa mulai bekerja adalah membuat gips dari
int
ketargetType
jadi saya membuatnya hardcode keNavigationProjectDates
, enum yang saya gunakan. Dan,targetType == NavigationProjectDates
...Edit untuk konverter Flags Enum yang lebih umum:
sumber
Anda dapat membuat tombol radio secara dinamis,
ListBox
dapat membantu Anda melakukan itu, tanpa konverter, cukup sederhana.Langkah-langkah concreate di bawah ini: membuat ListBox dan mengatur ItemsSource untuk listbox sebagai enum
MyLovelyEnum
dan mengikat SelectedItem dari ListBox keVeryLovelyEnum
properti. Kemudian Tombol Radio untuk setiap ListBoxItem akan dibuat.Control Template
setiap item di dalamnya sebagai tombol RadioThe Keuntungan bawah: jika suatu hari nanti perubahan kelas enum Anda, Anda tidak perlu memperbarui GUI (file XAML).
Referensi: https://brianlagunas.com/a-better-way-to-data-bind-enums-in-wpf/
sumber