我的组件包含一个表,我正在调用一个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>
答案 0 :(得分:1)
SetSelectedItem
应该是异步的,并且ItemSelected
可以等待(例如返回任务)。然后,onclick事件将正确地等待事件处理程序执行,而不是立即完成而没有效果,就像现在一样,因为它在更改生效之前就终止了。