Надеюсь, это даст вам то, что вам нужно. Я вижу две вещи, которые, как мне кажется, работают против вас.
Сначала , в частичном классе Cardlist у вас есть список, украшенный атрибутом [Parameter]
, но вы никогда не устанавливаете параметр из вызывающего кода. Вам нужно будет установить ОБА параметры TItem
и Items
, чтобы заставить его работать правильно, чтобы список карт знал и то, какой тип содержит список, и где найти список. Помните, что в C# списки являются ссылочным типом, поэтому Items
, который вы устанавливаете, на самом деле является просто ссылкой на любой предоставленный вами список, а не на сам список в новой форме или новый список вообще. Таким образом, ваш DeliveryList должен иметь что-то вроде свойства списка, показанного ниже:
public partial class DeliveryList : PageComponentBase
{
......
private <IReadOnlyList<dbDelivery>> CardListContents { get; set; }
......
}
Затем в DeliveryList.razor вы передадите ссылку на список компоненту Cardlist следующим образом:
<CardList @key="this._MyComponent" TItem="dbDelivery" Items="@CardListContents" ....>
</CardList>
Теперь компонент Cardlist становится инструментом рендеринга для внешнего списка типа generi c.
Второй , есть некоторая неопределенность в отношении того, что UpdateList
должен делать, но я сделаю предположение, что вы подключаете кнопку, которая заставит список обновить sh при нажатии. Для этого вы можете использовать обратный вызов события в списке карт.
Ваш Cardlist.razor теперь становится:
@inherits ComponentComponentBase
@typeparam TItem
........................
create a table of values with pagination
..................
<button @onclick="OnUpdateButtonClickedCallBack">Update List</button>
А ваш Cardlist.razor.cs становится:
public partial class CardList<TItem> : ComponentComponentBase
{
......
[Parameter]
public IReadOnlyList<TItem> Items { get; set; }
......
[Parameter]
public EventCallBack OnUpdateButtonClickedCallBack { get; set;}
}
Теперь вы настроены на указание на внешний метод, который будет выполняться при нажатии кнопки «Обновить список».
Далее вам нужно подключить метод в файле DeliveryList.razor.cs, и мы можем использовать ваш метод WantToUpdateList
:
public partial class DeliveryList : PageComponentBase
{
......
private <IReadOnlyList<dbDelivery>> CardListContents { get; set; }
private WantToUpdateList()
{
//Since the list is read only you need to generate a new one
//or call a method from elsewhere that returns a new one,
//change the method below to suit your needs
CardListContents = new IReadOnlylist<dbDelivery>();
}
......
}
Теперь вы можете указать этот метод с помощью EventCallback, который вы создали при объявлении списка карт. Обратите внимание, что конфигурация становится довольно длинной, поэтому я разделил ее на несколько строк:
<CardList @key="this._MyComponent"
OnUpdateButtonClickedCallBack="@WantToUpdateList" //Sets the callback function
TItem="dbDelivery" //Sets the type
Items="@CardListContents" ....> //Points to the list
</CardList>
Теперь вы можете использовать компонент <Cardlist>
с любым списком только для чтения, указав тип, список и функцию обратного вызова для работы с , Список карт становится независимым инструментом рендеринга, и все состояния, logi c и функции для этого списка находятся в одном месте внутри вызывающего компонента, что делает <CardList>
действительно универсальным c и переносимым. В этом примере любые обновления списка должны быть обработаны движком Blazor и инициировать повторную визуализацию, но если нет, вы можете добавить вызов к StateHasChanged();
в качестве последней строки вашего метода Update в вызывающем коде, и вы должен быть в бизнесе.
Обратите внимание, что это решение еще не завершено, поскольку вам, вероятно, потребуется добавить RenderFragment
logi c в Cardlist
, чтобы указать, как вы хотите визуализировать вашу таблицу.
. Базовая документация. NET отлично справляется с этой задачей. Похоже, вы, возможно, уже видели это, так как стилизация кода похожа, и не включила ее сюда для ясности.
Надеюсь, это поможет!