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}
<StackPanel>
<StackPanel.Resources>
<local:ComparisonConverter x:Key="ComparisonConverter" />
</StackPanel.Resources>
<RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum1}}" />
<RadioButton IsChecked="{Binding Path=YourEnumProperty, Converter={StaticResource ComparisonConverter}, ConverterParameter={x:Static local:YourEnumType.Enum2}}" />
</StackPanel>
Kemudian sederhanakan konverter:
public class ComparisonConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value?.Equals(parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value?.Equals(true) == true ? parameter : Binding.DoNothing;
}
}
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:
public class EnumToBooleanConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((Enum)value).HasFlag((Enum)parameter);
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return value.Equals(true) ? parameter : Binding.DoNothing;
}
}
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:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
if (value == null) {
return false; // or return parameter.Equals(YourEnumType.SomeDefaultValue);
}
return value.Equals(parameter);
}
Catatan - NullReferenceException (10 Okt '18):
Diperbarui contoh untuk menghapus kemungkinan melempar NullReferenceException.
IsChecked
adalah jenis yang dapat dibatalkan sehingga mengembalikan
Nullable<Boolean>
tampaknya merupakan solusi yang masuk akal.