Bạn có thể đơn giản hóa hơn nữa câu trả lời được chấp nhận. Thay vì gõ enum dưới dạng chuỗi trong xaml và thực hiện nhiều công việc trong trình chuyển đổi của bạn hơn mức cần thiết, bạn có thể chuyển rõ ràng giá trị enum thay vì biểu diễn chuỗi và như CrimsonX nhận xét, lỗi được đưa ra trong thời gian biên dịch thay vì thời gian chạy:
ConverterParameter = {x: Tĩnh cục bộ: 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>
Sau đó đơn giản hóa trình chuyển đổi:
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;
}
}
Chỉnh sửa (ngày 16 tháng 12 năm 10):
Cảm ơn anon đã đề xuất trả lại Binding.DoNoth thay vì DependencyProperty.UnsetValue.
Lưu ý - Nhiều nhóm RadioButtons trong cùng một thùng chứa (ngày 17 tháng 2 năm 11):
Trong xaml, nếu các nút radio chia sẻ cùng một vùng chứa cha, thì việc chọn một nút sẽ bỏ chọn tất cả các vùng khác trong vùng chứa đó (ngay cả khi chúng bị ràng buộc với một thuộc tính khác). Vì vậy, hãy cố gắng giữ cho RadioButton của bạn được liên kết với một thuộc tính chung được nhóm lại với nhau trong thùng chứa riêng của chúng như bảng ngăn xếp. Trong trường hợp RadioButtons liên quan của bạn không thể chia sẻ một thùng chứa cha mẹ duy nhất, sau đó đặt thuộc tính GroupName của mỗi RadioButton thành một giá trị chung để nhóm chúng một cách hợp lý.
Chỉnh sửa (ngày 5 tháng 4 năm 11):
Đơn giản hóa ConvertBack's if-other để sử dụng Toán tử Ternary.
Lưu ý - Loại Enum được lồng trong một lớp (28 tháng 4 '11):
Nếu loại enum của bạn được lồng trong một lớp (chứ không phải trực tiếp trong không gian tên), bạn có thể sử dụng cú pháp '+' để truy cập enum trong XAML như đã nêu trong câu trả lời (không được đánh dấu) cho câu hỏi
Không thể tìm thấy loại enum cho tham chiếu tĩnh trong WPF :
ConverterParameter = {x: Tĩnh cục bộ: YourClass + YourNestedEnumType.Enum1}
Tuy nhiên, do sự cố Microsoft Connect này , nhà thiết kế trong VS2010 sẽ không tải thông báo nữa "Type 'local:YourClass+YourNestedEnumType' was not found."
, nhưng dự án đã biên dịch và chạy thành công. Tất nhiên, bạn có thể tránh vấn đề này nếu bạn có thể di chuyển loại enum của mình sang không gian tên trực tiếp.
Chỉnh sửa (27 tháng 1 '12):
Nếu sử dụng cờ Enum, trình chuyển đổi sẽ như sau:
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;
}
}
Chỉnh sửa (ngày 7 tháng 5 năm 15):
Trong trường hợp Enum Nullable (
không được hỏi trong câu hỏi, nhưng có thể cần thiết trong một số trường hợp, ví dụ ORM trả về null từ DB hoặc bất cứ khi nào có thể có nghĩa là trong logic chương trình, giá trị không được cung cấp), hãy nhớ thêm kiểm tra null ban đầu trong Phương thức chuyển đổi và trả về giá trị bool thích hợp, thường là sai (nếu bạn không muốn bất kỳ nút radio nào được chọn), như dưới đây:
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);
}
Lưu ý - NullReferenceException (ngày 10 tháng 10 năm 18):
Đã cập nhật ví dụ để loại bỏ khả năng ném NullReferenceException.
IsChecked
là một loại nullable vì vậy trở lại
Nullable<Boolean>
có vẻ là một giải pháp hợp lý.