事件触发后Blazor组件未刷新

时间:2020-01-15 10:39:34

标签: c# asp.net-core razor

我的组件包含一个表,我正在调用一个func,当我单击这样的行时会触发一个事件:

<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移动了,现在它可以工作了,但是我不明白为什么如果我将它放置在前面,为什么它会返回到false,而如果我之前放置它的话,SelectedItem会保持良好的值。 / p>

1 个答案:

答案 0 :(得分:1)

SetSelectedItem应该是异步的,并且ItemSelected可以等待(例如返回任务)。然后,onclick事件将正确地等待事件处理程序执行,而不是立即完成而没有效果,就像现在一样,因为它在更改生效之前就终止了。