C# 将枚举的每个值绑定到复选框Blazor

C# 将枚举的每个值绑定到复选框Blazor,c#,enums,blazor,.net-5,enum-flags,C#,Enums,Blazor,.net 5,Enum Flags,我有一个[Flags]枚举,其中包含一些我想要收集的数据点。我的目标是将每个值(每个位)显示并绑定为一个单独的复选框,供用户检查。但是,我不知道如何将标志枚举的各个值绑定到组件,也不知道这是否可行。为了更好地解释我的观点: 假设这是我的枚举: [标志] 公共枚举数据点{ 大=1, Soft=2, 绿色=4, 圆形=8 } 然后,我希望表单模型中的DataPoints类型的属性能够保存这些值: //可能的数据点如下: //9:圆大 //6:柔软绿色 公共数据点数据; 我的想法如下,但我不认为可

我有一个[Flags]枚举,其中包含一些我想要收集的数据点。我的目标是将每个值(每个位)显示并绑定为一个单独的复选框,供用户检查。但是,我不知道如何将标志枚举的各个值绑定到组件,也不知道这是否可行。为了更好地解释我的观点:

假设这是我的枚举:

[标志]
公共枚举数据点{
大=1,
Soft=2,
绿色=4,
圆形=8
}
然后,我希望表单模型中的DataPoints类型的属性能够保存这些值:

//可能的数据点如下:
//9:圆大
//6:柔软绿色
公共数据点数据;
我的想法如下,但我不认为可以将枚举的单个值/位绑定到这样的组件:

@foreach(Enum.GetValues中的数据点数据(typeof(DataPoints)))
{
}

我发现自己在Blazor中做了很多事情,我称之为carrier类,特别是用于选择项目的类。我使用相同的技术从列表中选择图像,从多项选择题中选择答案,等等

@foreach (var item in CheckableEnums)
{
    <span> @item.DataPoint.ToString() &nbsp;</span>
    <input type="checkbox" @bind="item.IsSelected" />
    <br />
}
<br />
@{ SumValue = (DataPoints)(CheckableEnums.Where(cb => cb.IsSelected).Select(val => (int)val.DataPoint)).Sum(); }
<span>Selected Flags: </span>@SumValue.ToString()

@code {
    [Flags]
    public enum DataPoints
    {
        Large = 1,
        Soft = 2,
        Green = 4,
        Round = 8
    }
    class CheckableEnum
    {
        public DataPoints DataPoint { get; set; }
        public bool IsSelected;
    }
    DataPoints SumValue { get; set; }
    List<CheckableEnum> CheckableEnums { get; set; } = new List<CheckableEnum>();
    protected override void OnInitialized()
    {
        foreach (var DPvalue in Enum.GetValues(typeof(DataPoints)))
            CheckableEnums.Add(new CheckableEnum() { DataPoint = (DataPoints)DPvalue });
    }
}
@foreach(CheckableEnums中的变量项)
{
@item.DataPoint.ToString()

}
@{SumValue=(DataPoints)(CheckableEnums.Where(cb=>cb.IsSelected)。选择(val=>(int)val.DataPoint)).Sum();} 所选标志:@SumValue.ToString() @代码{ [旗帜] 公共枚举数据点 { 大=1, Soft=2, 绿色=4, 圆形=8 } 类可检查枚举 { 公共数据点数据点{get;set;} 公选学校; } 数据点SumValue{get;set;} List CheckableEnums{get;set;}=new List(); 受保护的覆盖无效OnInitialized() { foreach(Enum.GetValues中的变量DPvalue(typeof(DataPoints))) 添加(新的CheckableEnum(){DataPoint=(DataPoints)DPvalue}); } }
-编辑- 前一把小提琴坏了,所以:
因为我的第一个答案已经被接受,所以我不想改变它。但如果有任何组合标志,JHBonarius建议使用
.Aggregate()
会更好:

在标记中:

@{ SumValue = CheckableEnums.Where(cb => cb.IsSelected).Select(val => val.DataPoint).Aggregate((DataPoints)0,(result, value) => result | value); }
和修改的测试标志:

@code {
    [Flags]
    public enum DataPoints
    {
        Large = 1,
        Soft = 2,
        Green = 4,
        Round = 8,

        LargeAndSoft = 3 // Added value.
    }
}
小提琴:

@vernou这个问题似乎没有什么帮助。我知道如何将一个复选框绑定到一个bool属性,我在问如何将多个复选框绑定到一个enum属性。几分钟后,我会很快给你一个答案,Bubinga。不错,但不完整。您基本上是在创建视图模型。仍然需要一个方法将其合并回单个对象(对列表中的所有项进行ORing)。(我个人会使用
Enum.GetValues(typeof(DataPoints)).ToArray()
,因为您不会对其进行修改)好的,我编辑了示例,将标志组合到一个对象中,
SumValue
.Select()
将标志转换为
int
,因此您只需使用
.Sum()
添加它们,然后将总和转换回
数据点类型。
.ToString()
方法按预期显示所有选定的标志。我称之为“载体类”,因为我使用它来合并数据和状态,而不是用于验证或诸如此类的事情。。。。在一个枚举值可能出现两次的情况下,它不会出现。4或4=4。4+4=8是的,没错。此外,如果任何标志是组合值(“SoftGreen=6”),它也不起作用。我不确定枚举可枚举集合的最有效方法是什么。它可能是LINQ
Aggregate
.Aggregate(0,(result,value)=>result | value)