คุณสามารถทำให้คำตอบที่ยอมรับได้ง่ายขึ้น แทนที่จะพิมพ์ enums เป็นสตริงใน xaml และทำงานในตัวแปลงของคุณได้มากกว่าที่ต้องการคุณสามารถส่งผ่านค่า enum แทนการแสดงสตริงได้และอย่างที่ CrimsonX แสดงความคิดเห็นข้อผิดพลาดเกิดขึ้นในเวลารวบรวมมากกว่ารันไทม์:
ConverterParameter = {x: static local: 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>
จากนั้นทำการแปลงให้ง่ายขึ้น:
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;
}
}
แก้ไข (16 ธันวาคม '10):
ขอบคุณ anon สำหรับการแนะนำการส่งคืน Binding.DoNothing มากกว่า DependencyProperty.UnsetValue
หมายเหตุ - RadioButtons หลายกลุ่มในที่เก็บเดียวกัน (17 ก.พ. 11):
ใน xaml หากปุ่มตัวเลือกใช้คอนเทนเนอร์หลักร่วมกันการเลือกหนึ่งรายการจะเป็นการยกเลิกการเลือกรายการอื่น ๆ ทั้งหมดภายในคอนเทนเนอร์นั้น (แม้ว่าจะถูกผูกไว้กับคุณสมบัติอื่น) ดังนั้นพยายามเก็บ RadioButton ของคุณที่ถูกผูกไว้กับคุณสมบัติทั่วไปจัดกลุ่มเข้าด้วยกันในภาชนะของตัวเองเช่นแผงสแต็ค ในกรณีที่ RadioButton ที่เกี่ยวข้องของคุณไม่สามารถแชร์คอนเทนเนอร์หลักเดียวจากนั้นตั้งค่าคุณสมบัติ GroupName ของแต่ละ RadioButton เป็นค่าทั่วไปเพื่อจัดกลุ่มตามหลักเหตุผล
แก้ไข (5 เม.ย. '11):
ตัวย่อ ConvertBack จะเป็น if-else เพื่อใช้ Ternary Operator
หมายเหตุ - ประเภท Enum ซ้อนกันในชั้นเรียน (28 เม.ย. 54):
ถ้าชนิด enum ของคุณจะซ้อนกันในชั้นเรียน (มากกว่าโดยตรงใน namespace) คุณอาจจะสามารถใช้ไวยากรณ์ '+' เพื่อเข้าถึง enum ใน XAML ตามที่ระบุไว้ใน (ไม่ได้ทำเครื่องหมาย) คำตอบของคำถาม
ไม่พบ ประเภท enum สำหรับการอ้างอิงแบบคงที่ใน WPF :
ConverterParameter = {x: static local: YourClass + YourNestedEnumType.Enum1}
อย่างไรก็ตามเนื่องจากMicrosoft Connect Issueนี้ผู้ออกแบบใน VS2010 จะไม่โหลดอีกต่อไป"Type 'local:YourClass+YourNestedEnumType' was not found."
แต่โครงการรวบรวมและทำงานได้สำเร็จ แน่นอนคุณสามารถหลีกเลี่ยงปัญหานี้ได้หากคุณสามารถย้ายประเภท enum ของคุณไปยังเนมสเปซได้โดยตรง
แก้ไข (27 ม.ค. 12):
หากใช้ค่าสถานะ Enum ตัวแปลงจะเป็นดังนี้:
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;
}
}
แก้ไข (7 พฤษภาคม '15):
ในกรณีของ Enum Nullable (ที่
ไม่ได้ถามในคำถาม แต่สามารถต้องการได้ในบางกรณีเช่น ORM คืนค่า null จาก DB หรือเมื่อใดก็ตามที่ทำให้รู้สึกว่าในตรรกะของโปรแกรมไม่มีค่า) อย่าลืมเพิ่ม การตรวจสอบ null ครั้งแรกในวิธีการแปลงและส่งกลับค่าบูลที่เหมาะสมซึ่งโดยทั่วไปจะเป็นเท็จ (หากคุณไม่ต้องการให้เลือกปุ่มตัวเลือก) ดังด้านล่าง:
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);
}
หมายเหตุ - NullReferenceException (10 ต.ค. 18):
อัปเดตตัวอย่างเพื่อลบความเป็นไปได้ในการขว้าง NullReferenceException
IsChecked
เป็นประเภท nullable ดังนั้นการส่งคืนจึง
Nullable<Boolean>
น่าจะเป็นทางออกที่สมเหตุสมผล