C# 将枚举的每个值绑定到复选框Blazor
我有一个[Flags]枚举,其中包含一些我想要收集的数据点。我的目标是将每个值(每个位)显示并绑定为一个单独的复选框,供用户检查。但是,我不知道如何将标志枚举的各个值绑定到组件,也不知道这是否可行。为了更好地解释我的观点: 假设这是我的枚举: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:柔软绿色 公共数据点数据; 我的想法如下,但我不认为可
[标志]
公共枚举数据点{
大=1,
Soft=2,
绿色=4,
圆形=8
}
然后,我希望表单模型中的DataPoints类型的属性能够保存这些值:
//可能的数据点如下:
//9:圆大
//6:柔软绿色
公共数据点数据;
我的想法如下,但我不认为可以将枚举的单个值/位绑定到这样的组件:
@foreach(Enum.GetValues中的数据点数据(typeof(DataPoints)))
{
}
我发现自己在Blazor中做了很多事情,我称之为carrier类,特别是用于选择项目的类。我使用相同的技术从列表中选择图像,从多项选择题中选择答案,等等
@foreach (var item in CheckableEnums)
{
<span> @item.DataPoint.ToString() </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”),它也不起作用。我不确定枚举可枚举集合的最有效方法是什么。它可能是LINQAggregate
:.Aggregate(0,(result,value)=>result | value)代码>