如何在使用布尔值列表的 Blazor 服务器应用程序中添加动态复选框?

How to add dynamic checkboxes in a Blazor-server app that use a list of booleans?

为了进一步澄清我的问题,我将首先向您展示如何使用我正在使用的 blazor 组件库添加一个复选框:

<MudCheckBox @bind-Checked="@Basic_CheckBox1"></MudCheckBox>
@code{
public bool Basic_CheckBox1 { get; set; } = false;
}

上面的代码创建了一个复选框,然后根据复选框是否被选中来将布尔值 Basic_CheckBox1 切换为 true 或 false。 这是我的代码

 @for (int i = 0; i < checkboxNames.Count; i++)
        {

            <MudCheckBox @bind-Checked="@checkboxBools[i]" Label="@checkboxNames[i]"></MudCheckBox>
        }

此代码一直有效,直到我选中或取消选中我创建的复选框,然后出现索引超出范围错误,我该如何解决?我需要使用布尔值列表,因为我不知道在运行时之前我需要多少复选框,如果有任何其他解决方案请告诉我。

可以把它想象成绑定不是在那里然后在循环中完成的,而是稍后完成的。到绑定完成时,i 的值已超出数组长度的末尾,已重复递增。相反,您可以将循环变量 i 的当前值保存到另一个变量中,然后在绑定中使用该其他变量:

    @for (int i = 0; i < checkboxNames.Length; i++)
    {
        var x = i;
        <MudCheckBox @bind-Checked="@checkboxBools[x]" Label="@checkboxNames[i]"></MudCheckBox>
    }

checkBoxBools 应该是一个 array/list 与 checkBoxNames 长度相同(初始化为具有相同数量的元素)。例如:

    string[] checkboxNames = new string[]{"a","b","c"};
    bool[] checkboxBools = new bool[3];

或者,如果其他东西提供了可变数量的名称:

    checkboxNames = context.People.Select(p => p.Name).ToArray();
    checkboxBools = new bool[checkBoxNames.Length];

https://try.mudblazor.com/snippet/GamQEFuFIwdRbzEx