【发布时间】:2023-03-14 05:50:01
【问题描述】:
我有一个 MatBlazor 表,它有一个数据源(项目)和与表中每一行关联的复选框。如果我使用@bind-Value,我没有任何问题,一切都按设计工作。但我正在向一个按钮添加验证,该验证取决于列表中的任何项目是否已“选中”以启用它。
因此,我转而使用 ValueChanged 属性,它是一个 EventCallback 并且没有运气使用所选值更新 UI。
我尝试调用 StateHasChanged() 甚至 InvokeAsync(),但 UI 没有更新。
<MatTable Items="@Projects" class="mat-elevation-z5 create-build-list" PageSize="50" ShowPaging="false" FilterByColumnName="ProjectName" Striped="true">
<MatTableHeader>
<th>Name</th>
<th>Key</th>
<th>Type</th>
<th>Include</th>
</MatTableHeader>
<MatTableRow>
<td>@context.ProjectName</td>
<td>@context.Key</td>
<td>@context.ProjectType</td>
<td><MatCheckbox Label="Add To Build" ValueChanged="@((bool val) => CheckBoxValue(val, context))" ValueExpression="@(() => context.IsChecked)"></MatCheckbox></td>
</MatTableRow>
</MatTable>
方法如下
void CheckBoxValue(bool e, MyProjectKey key)
{
foreach(var p in Projects)
{
if(p.Key == key.Key)
{
p.IsChecked = true;
}
};
//-- I'll do more stuff here.
}
当它调用函数但不更新 UI 时,我是否遗漏了什么。
【问题讨论】:
-
您的意思是将 context.Key 传递给方法吗?您似乎正在传递整个上下文/项目
-
如果我将类型更改为字符串并只传递“密钥”而不传递对象,我会得到相同的结果。 @code{} 块中的模型显示它更新,但 UI 不保存选择。我还尝试添加 StateHasChanged() component.Base 方法来通知重新渲染,但视图仍然没有保存更改。很奇怪。