Компонент Blazor не обновляется после запуска события

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

<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 события 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();
}

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

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

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 ответ


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


Есть идеи?

10000