Blazor 组件的动态类型参数

Dynamic type parameter for Blazor components

我想为多种数据类型设计一个通用的 radzen 数据网格。这意味着在剃刀页面上我有 radzen 数据网格的通用标记。记录集和列定义动态绑定到网格。我的问题是“TItme”。

我需要这样的东西:

TItem="typeof(data.records[0])"

Datagrid如下:

<RadzenDataGrid FilterMode="FilterMode.Simple" Data="@data.records" TItem="typeof(data.records[0])" AllowFiltering="@data.allowFiltering" AllowPaging="@data.allowPaging" AllowSorting="@data.allowSorting">       
    <Columns>
        @foreach (var colDef in data.columnDefinitions)
        {
            <RadzenDataGridColumn TItem="typeof(data.records[0])" Property="@colDef.columnProperty" Title="@colDef.columnTitle"  />
        }            
    </Columns>           
</RadzenDataGrid>

您可能想尝试 dotnet 6 中的动态组件:

<DynamicComponent Type="@componentType" Parameters="@parameters" />

@code {
    private Type componentType = ...;
    private IDictionary<string, object> parameters = ...;
}

文档: https://docs.microsoft.com/en-us/aspnet/core/blazor/components/dynamiccomponent?view=aspnetcore-6.0

其他 dotnet 版本的另一种选择是尝试直接在代码中定义渲染片段(注意带有 ATTENTION 注释的行):

@page "/built-content"

<h1>Build a component</h1>

<div>
    @CustomRender
</div>

<button @onclick="RenderComponent">
    Create three Pet Details components
</button>

@code {
    private RenderFragment? CustomRender { get; set; }

    private RenderFragment CreateComponent() => builder =>
    {
        for (var i = 0; i < 3; i++) 
        {
            builder.OpenComponent(0, typeof(PetDetails));
            builder.AddAttribute(1, "PetDetailsQuote", "Someone's best friend!");
            builder.AddAttribute(2, "TItem", typeof(data.records[0])); // ATTENTION
            builder.CloseComponent();
        }
    };

    private void RenderComponent()
    {
        CustomRender = CreateComponent();
    }
}

文档: https://docs.microsoft.com/en-us/aspnet/core/blazor/advanced-scenarios?view=aspnetcore-3.1