如何在通用表模板内的 Blazor WebAssembly 中的虚拟化组件中指定 TItem 的类型

fin*_*s10 5 c# asp.net-core blazor blazor-client-side blazor-webassembly

我正在我的项目中构建通用表模板blazor webassembly。按照文档,我设置了表模板,并尝试在表模板中启用虚拟化,如下所示。

表模板.razor:

@typeparam TItem

<table class="@CssClass">
    <thead>
        <tr>@TableHeader</tr>
    </thead>
    <tbody>
        @if (Virtualize)
        {
            <Virtualize Context="item" Items="Items">
                <ItemContent>
                    <tr>@RowTemplate(item)</tr>
                </ItemContent>
                <Placeholder>
                    <p>Loading..</p>
                </Placeholder>
            </Virtualize>
        }
        else
        {
            @foreach (var item in Items)
            {
                <tr>@RowTemplate(item)</tr>
            }
        }
    </tbody>
</table>
Run Code Online (Sandbox Code Playgroud)

TableTemplate.razor.cs:

public partial class TableTemplate<TItem>
{
    [Parameter]
    public string CssClass { get; set; }

    [Parameter]
    public bool Virtualize { get; set; }

    [Parameter]
    public RenderFragment TableHeader { get; set; }

    [Parameter]
    public RenderFragment<TItem> RowTemplate { get; set; }

    [Parameter]
    public IReadOnlyList<TItem> Items { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

但我收到以下错误,

无法从用法中推断出方法“TypeInference.CreateVirtualize_0(RenderTreeBuilder, int, int, ICollection, int, RenderFragment, int, RenderFragment)”的类型参数。

TItem如何在 Virtualize 组件中指定类型?请协助。

Ron*_*ijm 9

TItem是一个泛型类型,所以你需要将它交给组件virtualize(也是一个泛型类型),如下所示:

@typeparam TItem

<table class="@CssClass">
    <thead>
        <tr>@TableHeader</tr>
    </thead>
    <tbody>
        @if (Virtualize)
        {
            <Virtualize Context="item" Items="Items" TItem="TItem">
                <ItemContent>
                    <tr>@RowTemplate(item)</tr>
                </ItemContent>
                <Placeholder>
                    <p>Loading..</p>
                </Placeholder>
            </Virtualize>
        }
        else
        {
            @foreach (var item in Items)
            {
                <tr>@RowTemplate(item)</tr>
            }
        }
    </tbody>
</table> 
Run Code Online (Sandbox Code Playgroud)

此外,您的项目也不能是public IReadOnlyList<TItem> Items { get; set; }这样,因为您会得到一个例外,即它无法将其转换为ICollection<TItem>

所以这部分应该是:

    [Parameter]
    public ICollection<TItem> Items { get; set; }
Run Code Online (Sandbox Code Playgroud)