You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

Blazor Hybrid DataGrid优化:如何仅在Grid层声明TRowData

Blazor GGrid2 组件优化:统一声明TRowData类型

核心实现思路

通过Blazor的**级联值(CascadingValue)**机制,将GGrid2组件上声明的TRowData类型向下传递给所有子GCol2组件,避免每列重复声明类型参数。

具体修改步骤

1. 改造GGrid2组件,传递级联类型

在GGrid2的razor文件中,用CascadingValue包裹子内容,将当前TRowData的类型作为级联值传递:

@typeparam TRowData

<CascadingValue Value="typeof(TRowData)" Name="GridRowDataType">
    <!-- 保留原有GGrid2的渲染逻辑,比如表格结构、数据绑定等 -->
    @ChildContent
</CascadingValue>

对应的代码后置文件(GGrid2.razor.cs)中,确保类型参数和子内容参数正确定义:

public partial class GGrid2<TRowData> : ComponentBase
{
    [Parameter] public RenderFragment? ChildContent { get; set; }
    // 保留其他原有参数(如数据源、分页配置等)
}

2. 修改GCol2组件,接收级联类型

移除GCol2原有的@typeparam TRowData声明,改用级联参数接收来自GGrid2的类型:

<!-- 移除@typeparam TRowData -->

@code {
    [CascadingParameter(Name = "GridRowDataType")]
    private Type RowDataType { get; set; } = default!;

    // 调整原有参数,适配动态类型
    [Parameter] public string Header { get; set; } = string.Empty;
    [Parameter] public Expression<Func<object, object>>? Field { get; set; }
    [Parameter] public RenderFragment<object>? CellTemplate { get; set; }

    // 处理字段值获取的逻辑,通过反射适配动态类型
    protected object? GetFieldValue(object rowData)
    {
        if (Field == null) return null;
        var compiled = Field.Compile();
        return compiled(rowData);
    }
}

如果需要强类型支持,可以通过泛型工厂或反射创建泛型实例,处理更复杂的逻辑。

3. 优化后的使用方式

现在只需在GGrid2外层声明一次TRowData,所有子GCol2自动继承该类型:

<GGrid2<TRowData="User">
    <GCol2 Header="用户名" Field="@(u => ((User)u).UserName)" />
    <GCol2 Header="邮箱" Field="@(u => ((User)u).Email)" />
    <!-- 或者使用CellTemplate实现自定义渲染 -->
    <GCol2 Header="状态">
        <CellTemplate>
            @{
                var user = context as User;
                <span class="@(user.IsActive ? "text-green" : "text-gray")">@(user.IsActive ? "活跃" : "禁用")</span>
            }
        </CellTemplate>
    </GCol2>
</GGrid2>

补充说明

  • 如果GCol2需要在GGrid2外部单独使用,需添加兼容逻辑:比如新增可选的[Parameter] public Type? RowDataType { get; set; },当级联值不存在时使用手动指定的类型。
  • 对于复杂的表达式解析,可以封装一个工具类,将Expression<Func<object, object>>转换为对应TRowData类型的表达式,减少代码中的强制转换。

内容的提问来源于stack exchange,提问作者Mark Brookes

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.31 11:56:34