首页 > 解决方案 > 将 CheckBox 绑定到枚举值

问题描述

这似乎是一个非常基本的想法,我只是无法在任何地方找到答案。我想将枚举类型或类绑定到类似于使用 ComboBox 完成的复选框。例如:

public class MyClass
{
    public int Value {get; set;}
    public string Display {get; set;}
}

然后在 XAML 中绑定到类,如:

<ComboBox x:Name="comboBoxMyCb" ItemsSource="{Binding ListOfMyClass}" DisplayMemberPath="Display" SelectedValuePath="Value"/>

然后,当事件发生时,我可以稍后像这样获取值:

int val = (int)comboBoxMyCb.SelectedValue;

基本上我想做类似的事情,但更简单。我正在制作一个枚举值列表,每个值对应一个复选框。我当前的设置是当我关闭窗口时检查哪些复选框已被选中并将其相应的枚举值添加到列表中。这产生了很多 if 语句,因为它们可以是 40 个以上的复选框。我想做的是将每个复选框绑定到 XAML 中的一个枚举值,然后将它们的每个 onclick 事件设置为一个看起来像这样的函数:

private void CheckBoxItem_Click(object sender, RoutedEventArgs e)
{
    CheckBox cb = (CheckBox)sender;
    MyEnum value = (MyEnum)cb.value;//or whatever
    if (cb.IsChecked == true)
    {
        EnumList.add(value)
    }
    else
    {
        EnumList.remove(value);
    }
}

我知道有些代码不是最优的,我只是把这一切作为一个例子来写。感谢您的任何帮助

标签: c#wpf

解决方案


您可以编写一个包装类来表示您的枚举。例如,考虑示例枚举

public enum SampleEnum
{
        [Description("Description 01")]
        Sample01,
        [Description("Description 02")]
        Sample02,
        [Description("Description 03")]
        Sample03
} 

现在你可以写一个包装器

public class Wrapper
{
        public SampleEnum Value { get; set; }
        public string Description => GetEnumDescription(Value);
        public bool IsSelected { get; set; }

        private string GetEnumDescription(Enum value)
        {
            FieldInfo fi = value.GetType().GetField(value.ToString());
            DescriptionAttribute[] attributes = (DescriptionAttribute[])fi.GetCustomAttributes(typeof(DescriptionAttribute), false);

            if (attributes.Length > 0)
                return attributes[0].Description;
            else
                return value.ToString();
        }
}

您现在可以在视图模型中创建一个集合

public List<Wrapper> EnumCollection { get; set; } 

可以初始化为

EnumCollection = Enum.GetValues(typeof(SampleEnum))
                .Cast<SampleEnum>()
                .Select(x => new Wrapper { Value = x, }).ToList();

此集合现在可以绑定到您的复选框集合。例如,

<ItemsControl ItemsSource="{Binding EnumCollection}">
            <ItemsControl.ItemTemplate>
                <DataTemplate>
                    <CheckBox Content="{Binding Description}" IsChecked="{Binding IsSelected}"/>
                </DataTemplate>
            </ItemsControl.ItemTemplate>
</ItemsControl>

IsSelected 标志将帮助您跟踪是否选择了特定的枚举。


推荐阅读