Blazor EventCallback如何向父组件传递含rowID的多个回调参数
解决方案
你期望的双参数回调写法完全可以实现,核心是通过父组件Lambda表达式闭包捕获当前迭代的rowID,无需修改子组件代码或GenericWidgets定义,修改内容如下:
1. 调整父组件中子组件的回调绑定
把原来的onAddingWidget="AddWidgetToRow"修改为Lambda表达式,同时接收子组件返回的GenericWidgets对象和当前循环的rw.rowID:
<AddWidgetToColumnComponent rowID="rw.rowID" onAddingWidget="(widget) => AddWidgetToRow(widget, rw.rowID)"> </AddWidgetToColumnComponent>
2. 调整父组件回调方法签名
直接使用你期望的双参数定义即可:
private void AddWidgetToRow(GenericWidgets evnt, int rowID) { // 直接使用传入的rowID查找对应行,不需要硬编码ID var row = pg.rows.Where(x => x.rowID == rowID).FirstOrDefault(); row?.addWidgetSection1(evnt); }
注意事项
如果使用的是.NET 6之前的Blazor版本,循环内捕获变量存在闭包陷阱,需要在循环内额外声明临时变量存储当前行对象:
@foreach (var rw in pg.rows) { // 新增临时变量避免闭包问题 var currentRow = rw; @if (currentRow.rowDef == 1) { @if (currentRow.widgetsSection1.Count == 0) { <AddWidgetToColumnComponent rowID="currentRow.rowID" onAddingWidget="(widget) => AddWidgetToRow(widget, currentRow.rowID)"> </AddWidgetToColumnComponent> } } }
内容的提问来源于stack exchange,提问作者Jseb
相关产品推荐
相关产品推荐

