您可以进一步简化接受的答案。您可以显式传递枚举值而不是字符串表示形式,而不必在xaml中将枚举类型作为字符串在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放在一个自己的容器(如堆栈面板)中,将其分组在一起。如果您的相关RadioButton无法共享单个父容器,则将每个RadioButton的GroupName属性设置为一个公共值,以对其进行逻辑分组。
编辑(11年5月5日):
简化了ConvertBack的if-else以使用三元运算符。
注意-嵌套在类中的枚举类型(11年4月28日):
如果您的枚举类型嵌套在一个类(而不是直接在命名空间),如在(未标示)回答说这个问题你也许可以用“+”语法来访问在XAML枚举
无法找到WPF中静态引用的枚举类型:
ConverterParameter = {x:静态局部:YourClass + YourNestedEnumType.Enum1}
但是,由于此Microsoft Connect问题,VS2010中的设计器将不再加载说明"Type 'local:YourClass+YourNestedEnumType' was not found."
,但该项目确实可以编译并成功运行。当然,如果能够将枚举类型直接移动到名称空间,则可以避免此问题。
编辑(2012年1月27日):
如果使用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;
}
}
编辑(15年5月7日):
如果为Nullable枚举(问题中
未要求,但在某些情况下可能需要,例如ORM从数据库返回null或在程序逻辑中没有提供该值的任何时候),请记住添加在Convert方法中进行初始空检查并返回适当的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(18年10月10日):
更新了示例,以消除引发NullReferenceException的可能性。
IsChecked
是可为null的类型,因此返回
Nullable<Boolean>
似乎是一个合理的解决方案。