如何在通用 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; }
我正在我的 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; }