【问题标题】:Bind each value of an enum to a checkbox Blazor将枚举的每个值绑定到复选框 Blazor
【发布时间】:2023-03-06 09:21:02
【问题描述】:

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

说这是我的枚举:

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

然后我想要在我的表单的 DataPoints 类型模型中拥有一个可以保存这些值的属性:

//possible data points like:
// 9: Round and Large
// 6: Soft and Green
public DataPoints Data;

我在想类似以下的事情,但我认为您不能将枚举的单个值/位绑定到这样的组件:

@foreach (DataPoints datum in Enum.GetValues(typeof(DataPoints)))
   {
      <CheckBox @bind-Value="what? Data.datum?"></CheckBox>
   }

【问题讨论】:

  • @vernou 这个问题似乎没有帮助。我知道如何将单个复选框绑定到单个 bool 属性,我在问如何将多个复选框绑定到枚举属性
  • 等一下,我很快就会给你答复,布宾加。

标签: c# enums blazor .net-5 enum-flags


【解决方案1】:

我发现自己在 Blazor 中经常做的事情是制作我所说的载体类,尤其是在选择物品方面。我使用相同的技术从列表中选择图像、从多项选择题中选择答案等等。

@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 });
    }
}

-编辑- 以前的小提琴坏了,所以: https://blazorfiddle.com/s/t523591k

【讨论】:

  • 不错,但不完整。你基本上是在制作一个视图模型。仍然需要一种方法将其组合回单个对象(对列表中的所有项目进行 ORing)。 (我个人会使用Enum.GetValues(typeof(DataPoints)).ToArray(),因为你不会改变它)
  • 好的,我编辑了示例以将标志组合成一个对象,SumValue.Select() 将标志转换为int,因此您只需将它们与.Sum() 相加,然后将总和转换回DataPoints 类型。 .ToString() 方法按预期显示所有选定的标志。我将其称为“运营商类”,因为我使用它来合并数据和状态,而不是用于验证或类似的东西。
  • 是的,sum 在这种情况下有效....如果您遇到一个枚举值可能出现两次的情况,它不会出现。 4 或 4 = 4。4+4=8
  • 是的,没错。此外,如果任何标志是组合值(“SoftGreen = 6”),它也不会起作用。我不确定对 Enumerable 集合进行 OR-ing 的最有效方法。
  • 可能是LINQ Aggregate: .Aggregate(0,(result, value) =&gt; result | value);
【解决方案2】:

由于我的第一个答案已被接受,我不想更改它。但是如果有任何组合标志,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.
    }
}

小提琴: https://blazorfiddle.com/s/hu9kooon

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 2012-08-19
    • 2011-12-06
    • 2012-04-21
    • 2012-01-21
    • 2018-06-09
    • 2016-02-06
    • 2010-09-24
    • 2016-03-13
    相关资源
    最近更新 更多