Blazor模板中能否同时访问数据项与GridRow的Id属性?
解决方案
要实现在GridBody模板中同时访问自增Id和TItem属性,核心是调整泛型Grid组件的模板上下文类型,让模板接收包含Id与TItem的包装对象而非直接接收TItem。以下是具体实现步骤:
1. 定义GridRow包装类
先创建一个泛型类,用来封装自增Id和对应的TItem数据:
public class GridRow<TItem> { public int Id { get; set; } public TItem Item { get; set; } }
2. 修改泛型Grid组件
调整组件的模板参数类型,将原来接收RenderFragment<TItem>的GridBody改为接收RenderFragment<GridRow<TItem>>,同时在组件内部将传入的TItem列表转换为GridRow集合:
@typeparam TItem [Parameter] public IEnumerable<TItem> Items { get; set; } = Enumerable.Empty<TItem>(); // 修改模板参数类型为GridRow<TItem> [Parameter] public RenderFragment<GridRow<TItem>> GridBody { get; set; } private List<GridRow<TItem>> _gridRows; protected override void OnParametersSet() { // 生成带自增Id的GridRow集合,Id从1开始计数 _gridRows = Items.Select((item, index) => new GridRow<TItem> { Id = index + 1, Item = item }).ToList(); } <!-- 组件渲染逻辑 --> @foreach (var row in _gridRows) { @GridBody(row) }
3. 在Index.razor中使用
现在可以在GridBody模板中通过context.Id访问自增Id,通过context.Item.XXX访问TItem的属性:
@* 假设myItems是你的TItem类型列表 *@ <Grid Items="@myItems"> <GridBody> <tr> <td>@context.Id</td> <td>@context.Item.ProductName</td> <td>@context.Item.Price</td> </tr> </GridBody> </Grid>
这种方式完全不依赖TItem自身的Id属性,所有自增Id由Grid组件内部生成并通过GridRow传递给模板,同时保留了对TItem所有属性的访问能力。
内容的提问来源于stack exchange,提问作者Musaffar Patel
相关产品推荐
相关产品推荐

