wpf - 如何将单选按钮绑定(bind)到枚举?

标签 wpf data-binding enums radio-button

我有一个像这样的枚举:

public enum MyLovelyEnum
{
    FirstSelection,
    TheOtherSelection,
    YetAnotherOne
};

我在 DataContext 中有一个属性:

public MyLovelyEnum VeryLovelyEnum { get; set; }

我的 WPF 客户端中有三个 RadioButton。

<RadioButton Margin="3">First Selection</RadioButton>
<RadioButton Margin="3">The Other Selection</RadioButton>
<RadioButton Margin="3">Yet Another one</RadioButton>

现在如何将 RadioButtons 绑定(bind)到属性以实现正确的双向绑定(bind)?

最佳答案

您可以进一步简化已接受的答案。您可以显式传入枚举值而不是字符串表示形式,而不是在 xaml 中将枚举作为字符串键入并在转换器中执行更多的工作,并且正如 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;
    }
}
<小时/>

编辑(2010 年 12 月 16 日):

感谢 anon suggesting返回 Binding.DoNothing 而不是 DependencyProperty.UnsetValue。

<小时/>

注意 - 同一容器中的多组 RadioButton(2011 年 2 月 17 日):

在 xaml 中,如果单选按钮共享相同的父容器,则选择一个单选按钮将取消选择该容器内的所有其他单选按钮(即使它们绑定(bind)到不同的属性)。因此,请尝试将绑定(bind)到公共(public)属性的 RadioButton 保留在自己的容器中(如堆栈面板)。如果相关的 RadioButton 无法共享单个父容器,请将每个 RadioButton 的 GroupName 属性设置为公共(public)值以对它们进行逻辑分组。 <小时/>

编辑(2011 年 4 月 5 日):

简化了 ConvertBack 的 if-else 以使用三元运算符。 <小时/>

注意 - 嵌套在类中的枚举类型(2011 年 4 月 28 日):

如果您的枚举类型嵌套在类中(而不是直接在命名空间中),则您可以使用“+”语法来访问 XAML 中的枚举,如问题的(未标记)答案中所述:

ConverterParameter={x:Static local:YourClass+YourNestedEnumType.Enum1}

由于这个Microsoft Connect Issue但是,VS2010 中的设计器将不再加载并提示 “未找到类型 'local:YourClass+YourNestedEnumType'。”,但项目确实编译并成功运行。当然,如果您能够将枚举类型直接移至命名空间,则可以避免此问题。

<小时/>

编辑(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 从数据库返回 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` 是一个可以为 null 的类型,因此返回 `Nullable` 似乎是一个合理的解决方案。

关于wpf - 如何将单选按钮绑定(bind)到枚举?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/397556/

相关文章:

c# - 如何通过绑定(bind)到 ViewModel 来设置正确的 RadioButton.IsChecked 属性为真?

javascript - 在指令中插入 ng-repeat 的输出

javascript - 当子属性更改时重新评估对象绑定(bind)

c# - 根据枚举值创建字典

c - 来源洞察 : Show me Enum Values

wpf - 在 DataTemplates 内绑定(bind)时出现“找不到管理 FrameworkElement ...”警告

wpf - 用不同类型绑定(bind) DataGrid 中 ComboBox 的 SelectedItem

c# - 构建错误 MC1000 'Object reference doen' t 设置为实例

c# - 绑定(bind)数据网格后,项目集合必须为空

enums - 当协议(protocol)包含 Swift 中的枚举时检查协议(protocol)一致性?