Я создаю общий шаблон таблицы в своем проекте blazor webassembly
. Следуя документам, я настраиваю свой шаблон таблицы и пытаюсь включить виртуализацию в моем шаблоне таблицы следующим образом.
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>
ТаблицаTemplate.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; }
}
Но я получаю следующую ошибку,
Аргументы типа для метода 'TypeInference.CreateVirtualize_0(RenderTreeBuilder, int, int, ICollection, интервал, RenderFragment, интервал, RenderFragment)» нельзя вывести из Применение.
Как указать тип if TItem
в компоненте Virtualize? Пожалуйста помогите.
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; }
Это было упомянуто выше Роном в конце, но я хотел добавить, что мне пришлось изменить свою коллекцию с IEnumerable на ICollection. Как только я сделал это ТОЛЬКО изменение, моя страница Blazor начала работать. Мне НЕ нужно было устанавливать TItem. Спасибо Рону Сийму за информацию выше.