【问题标题】:Problem generate list of checkboxes from list of data models in Blazor问题从 Blazor 中的数据模型列表生成复选框列表
【发布时间】:2021-04-13 23:49:49
【问题描述】:

谁知道如何初始化一个复选框列表,其中只有 myPicketItemsStoredInDabase 项目标记为选中,所有其他项目标记为未选中?

当我尝试下面的代码示例时,所有复选框都标记为已选中。我尝试了不同的解决方案,但没有一个最终会出现一个复选框列表,其中正确的项目标记为已选中。

public class CheckboxItem
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public bool Checked { get; set; }
}

public class ItemFromDatabase
{
    public Guid Id { get; set; }
    public string Name { get; set; }
}

Page.razor

@foreach (var item in itemsToEdit)
{
    <CheckBoxItemComponent Items="@itemsToEdit" Value="@item.Name" Item="@item" />
}

@code {
    private IEnumerable<ItemFromDatabase> myPickedItemsStoredInDatabase;
    private IEnumerable<ItemFromDatabase> allItems;
    private List<CheckboxItem> itemsToEdit;

    protected override async Task OnInitializedAsync()
    {
        myPickedItemsStoredInDatabase = await getFromJsonAsync<ItemFromDatabase>.....
        allItems= await getFromJsonAsync<ItemFromDatabase>.....
        InitCheckboxItems();
    }

    private void InitCheckboxItems()
    {
        itemsToEdit = new List<CheckboxItem>();

        for (int i = 0; i < allItems.Length; i++)
        {
            CheckboxItem item = new CheckboxItem()
            {
                Id = allItems[i].Id,
                Name = allItems[i].Name,
                Checked = false
            };

            if (myPickedItemsStoredInDatabase.Any(p => p.Id == item.Id))
            {
                item.Checked = true;
            }

            itemsToEdit.Add(item);
        }
    }
}

CheckBoxItemComponent.razor

Activate multiple checkbox in a loop using Blazor

<input type="checkbox" @bind=isChecked />@Item.Name<br />

@code
{
    [Parameter]
    public string Value { get; set; }

    [Parameter]
    public CheckboxItem Item { get; set; }

    [Parameter]
    public List<CheckboxItem> Items { get; set; }

    private bool isChecked
    {
        get => Items.Any(el => el.Name == Value);
        set
        {
            if (value)
            {
                if (!Items.Any(el => el.Name == Value))
                    Items.Add(Item);
            }
            else
                Items.Remove(Item);
        }
    }
}`

【问题讨论】:

    标签: c# blazor


    【解决方案1】:

    我不明白 isChecked 中应该发生什么。
    要设置选中,您可以像这样修改 CheckBoxItemComponent.razor:

    <input type="checkbox" @bind=isChecked /> @Item.Name
    <br />
    @code
    {
    
        [Parameter]
        public CheckboxItem Item { get; set; }
    
        public bool isChecked
        {
            get => this.Item.Checked;
            set => this.Item.Checked = value;
        }
    }
    

    并在 Page.razor 中使用它:

    @foreach (var item in itemsToEdit)
    {
        <CheckBoxItemComponent Item="@item" />
    }
    

    【讨论】:

    • 谢谢 PinBack,你帮助了我的一天!您的解决方案解决了问题。
    【解决方案2】:

    此答案已被撤回,因为它没有正确回答问题。

    【讨论】:

    • @HenkHolterman。正如我所说的“五月”。从早期的 Blazor 开始编写这些代码后,我很快就自然而然地切换到使用局部循环变量,而没有调查并意识到 FOR 是罪魁祸首。你每天都会学到新东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2021-12-03
    • 2021-05-31
    • 2011-08-09
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多