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

How to specify the type of TItem in Virtualize Component in Blazor WebAssembly inside a Generic Table Template

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

TableTemplate.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>

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; }
}

但我收到以下错误,

The type arguments for method 'TypeInference.CreateVirtualize_0(RenderTreeBuilder, int, int, ICollection, int, RenderFragment, int, RenderFragment)' cannot be inferred from the usage.

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

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> 

此外,您的项目不能是 public IReadOnlyList<TItem> Items { get; set; },因为您会遇到无法将其转换为 ICollection<TItem>

的异常

所以那部分应该是:

    [Parameter]
    public ICollection<TItem> Items { get; set; }