Добавление класса компонента с typeparam как свойство в Blazor - PullRequest
1 голос
/ 02 апреля 2020

Для обычного компонента вы просто объявляете компонент как частное свойство и добавляете имя в качестве параметра @type в определение компонента.

Однако, когда я добавляю компонент с typeparam и настраиваю его как показано ниже, код компилируется и запускается, но свойство никогда не заполняется - оно всегда равно нулю. См. Метод WantToDoAnUpdate в последнем блоке кода. Я принудительно обновляю компонент, потому что он использует нумерацию страниц и не обновляется через обычные механизмы Blazor.

CardList.razor

@inherits ComponentComponentBase

@typeparam TItem

........................
create a table of values with pagination
..................

CardList.razor.cs

public partial class CardList<TItem> : ComponentComponentBase
{
  ......
  [Parameter]
  public IReadOnlyList<TItem> Items { get; set; }
  ......
  public void UpdateList()
  {
    ........
  }
}

DeliveryList.razor

@inherits PageComponentBase

<CardList@key="this._MyComponent" TItem="dbDelivery" ....>
</CardList>

DeliveryList.razor.cs

public partial class DeliveryList<TItem> : PageComponentBase
{
  ......
  private CardList<IReadOnlyList<dbDelivery>> _CardList { get; set; }
  ......

  public void WantToDoAnUpdate()
  {
  ....
    --ALWAYS NULL--
    if (this._CardList != null) this._CardList.UpdateList();
  }
}

Я предполагаю, что неправильно объявляю _CardList .

Ответы [ 2 ]

0 голосов
/ 17 апреля 2020

Отлично, спасибо за ответ. Да, я настраивал список, я просто не включил это в код. Cardlist использует предоставленный список для генерации постраничного списка (страница x из 25 значений), в котором и возникают проблемы. Поскольку визуализированный список является новым списком, созданным процессом разбиения на страницы из Items, обновление элементов не происходит, когда Items обновляется. Вызов UpdateList из родительского объекта приводит к повторному перелистыванию страничного списка и должен вызвать обновление производного списка и обновление пользовательского интерфейса.

Однако, поскольку я не смог заставить его работать, я начал копаться в основном коде Blazor на Github, чтобы увидеть, как разработчики Blazor сделали вещи. Теперь я решил проблему по-другому, используя обработчики событий в сервисе слоя logi c, который содержит список, без необходимости делать вызовы от родителя к потомку, чтобы вызвать обновление. Я также использовал обработчики событий, срабатывающие из набора свойств, в других случаях, таких как пользовательские элементы управления вводом / отображением.

В любом случае, еще раз спасибо, что нашли время ответить.

0 голосов
/ 15 апреля 2020

Надеюсь, это даст вам то, что вам нужно. Я вижу две вещи, которые, как мне кажется, работают против вас.

Сначала , в частичном классе 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 отлично справляется с этой задачей. Похоже, вы, возможно, уже видели это, так как стилизация кода похожа, и не включила ее сюда для ясности.

Надеюсь, это поможет!

...