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