您可以进一步简化接受的答案。您可以显式传入枚举值而不是字符串表示,而不是在 xaml 中将枚举作为字符串输入并在转换器中做更多的工作,并且正如 CrimsonX 评论的那样,错误会在编译时而不是运行时抛出:
ConverterParameter={x:静态本地: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;
}
}
编辑(2010 年 12 月 16 日):
感谢 anon建议返回 Binding.DoNothing 而不是 DependencyProperty.UnsetValue。
注意 - 同一容器中的多组 RadioButtons(2011 年 2 月 17 日):
在 xaml 中,如果单选按钮共享相同的父容器,则选择一个将取消选择该容器内的所有其他按钮(即使它们绑定到不同的属性)。因此,请尝试将绑定到公共属性的 RadioButton 组合在它们自己的容器中,例如堆栈面板。如果您的相关 RadioButtons 无法共享单个父容器,则将每个 RadioButton 的 GroupName 属性设置为一个公共值以对它们进行逻辑分组。
编辑(2011 年 4 月 5 日):
简化 ConvertBack 的 if-else 以使用三元运算符。
注意 - 嵌套在类中的枚举类型(2011 年 4 月 28 日):
如果您的枚举类型嵌套在一个类中(而不是直接在命名空间中),您可以使用“+”语法来访问 XAML 中的枚举,如问题的(未标记)答案中所述:
ConverterParameter={x:静态本地:YourClass+ YourNestedEnumType.Enum1}
然而,由于这个Microsoft Connect 问题,VS2010 中的设计器将不再加载说明"Type 'local:YourClass+YourNestedEnumType' was not found."
,但项目确实编译并运行成功。当然,如果您能够将枚举类型直接移动到命名空间,则可以避免此问题。
编辑(2012 年 1 月 27 日):
如果使用枚举标志,转换器将如下所示:
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;
}
}
编辑(2015 年 5 月 7 日):
在 Nullable Enum 的情况下(在问题中**没有**问,但在某些情况下可能需要,例如 ORM 从 DB 返回 null 或在程序逻辑中未提供值可能有意义的时候) ,请记住在 Convert 方法中添加初始 null 检查并返回适当的 bool 值,通常为 false(如果您不希望选择任何单选按钮),如下所示:
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(2018 年 10 月 10 日):
更新了示例以消除引发 NullReferenceException 的可能性。`IsChecked` 是一个可为空的类型,因此返回 `Nullable` 似乎是一个合理的解决方案。