c# - 将 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);
}
}
我知道有些代码不是最优的,我只是把这一切作为一个例子来写。感谢您的任何帮助
解决方案
您可以编写一个包装类来表示您的枚举。例如,考虑示例枚举
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 标志将帮助您跟踪是否选择了特定的枚举。
推荐阅读
- html - Web.config 重定向
- html - Flexbox 上的菱形网格
- python - 使用 Pandas 与 MySQL 读取巨大的 CSV 文件
- javascript - 带有反应比较示例的 jquery
- regex - nginx 位置正则表达式设置仅在指定的 url 上返回 404
- javascript - 如何在 JS 中过滤多个字符串?
- c# - LiveChart 不显示 x 轴 WPF 上的所有标签
- c - 我想让我的素数测距仪程序在 C 中更快
- angular - Firestore - 用户最喜欢的数据结构建议
- fedora - 无法在 Fedora 28 中构建 gnome-system-tools [glib-compile-schemas not found]