【问题标题】:Trigger a property from a component from other's component event in blazor从 blazor 中其他组件事件的组件触发属性
【发布时间】:2022-07-21 15:25:16
【问题描述】:

我有以下父 razor 组件,它是主表,它被分成小组件:


<div class="row">
    <TopSection DeleteCss="@deleteCssStyle" />
</div>

<div class="row">
    <div class="col-1">
        <div>
            <a href="" class="fs-4 fw-bold">
                <span class="oi oi-loop-circular text-black rotate-45"></span>
            </a>
        </div>
        <div>
            <a href="" class="fs-4 fw-bold">
                <span class="oi oi-account-logout text-black rotate-180"></span>
            </a>
        </div>
    </div>
    <div class="col-11">
        <div class="table-responsive" id="pay-table">
            <table class="table table-striped table-borderless">
                <TableHeader ... />
                <TableBody Items="@filteredList" OnCheckRow="@OnCheckRow" />
                <TableFooter ... />
            </table>
        </div>
    </div>
</div>

TopSection:

<div class="col-4">
    <a href="javascript:void(0)" class="btn">Edit</a>
    <a href="javascript:void(0)" class="btn">Add</a>
    <a href="javascript:void(0)" class="btn @DeleteCss">Delete</a>
</div>

后面的代码:

[Parameter]
public string DeleteCss { get; set; } = "disabled";

OnCheckRow

protected void OnCheckRow(int checkedRows)
{
    deleteCssStyle = checkedRows > 0 ? "" : "disabled";
}

TableBody

<tbody>
    @{
        foreach (var row in Items)
        {
            <tr @onclick="@((e)=> OnCheck(row) )">
                <td>
                    <EditForm Model="@row" class="form-check-inline">
                        <InputCheckbox @bind-Value="@row.IsChecked" id="@row.Id" />
                    </EditForm>
                    @row.Title
                </td>
                ...
                ...
            </tr>
        }
    }
</tbody>

和后面的代码:

[Parameter]
public Action<int> OnCheckRow { get; set; } = (i) => { };

protected void OnCheck(MyItem row)
{
     row.IsChecked = !row.IsChecked;
     OnCheckRow?.Invoke(Items.Count(s => s.IsChecked));
}

所以,我希望在检查至少一项时,我希望删除按钮可用,否则添加类“禁用”以避免点击它

似乎在触发点击时,TopAction 组件中 deleteCssStyle 的属性也没有更新,删除按钮仍然被禁用。

我迷路了。我想在这里寻求帮助。

【问题讨论】:

    标签: blazor


    【解决方案1】:

    试试这个解决方案,你可以使用 LINQ 进行测试

    protected void OnCheckRow(int checkedRows)
    {
       deleteCssStyle = Items.Any(x=> x.Ischecked) ? "" : "disabled;
    }
    

    【讨论】:

    • 问题不在于 OnCheckRow,我得到了正确的样式,但 DeleteCss 属性不再触发,只是在初始化时第一次