Компонент Blazor не refre sh после срабатывания события - PullRequest
1 голос
/ 15 января 2020

Мой компонент содержит таблицу, я вызываю забаву c, которая запускает событие, когда я нажимаю на строку, подобную этой:

<tr class="@(EqualityComparer<T>.Default.Equals(SelectedItem, rowValue.Key) && HasSelectedItem == true ? "data-grid-body-row-selected" : "data-grid-body-row")" @onclick="@(() => SetSelectedItem(rowValue.Key))">
   @foreach (RowData rowData in rowValue.Value) {
      <td>@rowData.Value</td>
   }
</tr>

public event EventHandler ItemSelected;

private void SetSelectedItem(T item) {
    SelectedItem = item;
    HasSelectedItem = true;
    ItemSelected.Invoke(this, null);
}

Проблема в том, что, когда я запускаю ItemSelected событие, класс <tr> не обновляется, однако, когда я удаляю строку ItemSelected.Invoke(this, null);, все снова работает нормально.

На моем родительском компоненте у меня есть это:

private MyComponent<Person> _ref;

protected override void OnInitializedAsync() {
   _ref.ItemSelected += ItemSelected;
}

protected virtual void ItemSelected(object sender, EventArgs e) {
   MyComponent<Person> _tmpref = (MyComponent<Person>)sender;
   SelectedPerson = _tmpref.SelectedItem;
   StateHasChanged();
}

и я выбрал правильный пункт, поэтому я попытался поместить StateHasChanged() до и после моего вызова в свой компонент, но ничего не изменилось. Я не могу найти, в чем проблема.

Редактировать

private async Task SetSelectedItem(T item) {
   SelectedItem = item;
   HasSelectedItem = true;
   await Task.Run(() => ItemSelected.Invoke(this, null));
}

Теперь он работает в течение нескольких секунд и возвращается в предыдущее состояние.

Решение

private async Task SetSelectedItem(T item) {
   SelectedItem = item;
   await Task.Run(() => ItemSelected.Invoke(this, null));
   HasSelectedItem = true;
}

Я просто переместил свой HasSelectedItem = true после Invoke, и теперь он работает, но я не понимаю, почему он возвращается к ложному, если я помещаю его раньше, в то время как мой SelectedItem остается в хорошем состоянии, если я позволю ему раньше.

1 Ответ

1 голос
/ 15 января 2020

SetSelectedItem должно быть asyn c и ItemSelected ожидаемым (например, при возврате задачи). Тогда событие onclick будет правильно ожидать, пока обработчик события не выполнится, а сразу же завершится без эффекта, как это происходит сейчас, потому что оно завершается до того, как изменения вступят в силу.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...