Используйте InvokeAsync() для переключения выполнения на Dispatcher при запуске рендеринга или состояния компонента.
У меня есть дочерний компонент в Blazor Server, который отображает таблицу. При щелчке строки в этой таблице у меня есть следующий метод обработчика и обратный вызов события для отправки данных родительскому компоненту (который заключает дочерний компонент во всплывающее окно, которое необходимо переключать при поступлении новых данных).
В
[Parameter]
public EventCallback<DataObj> OnDataObjSelection { get; set; }
DataObj _selectedDataObject { get; set; }
object SelectedDataObject
{
get
{
return _selectedDataObject;
}
set
{
_selectedDataObject = value as DataObj;
new Task(async () =>
{
await OnDataObjSelection.InvokeAsync(_selectedDataObject);
}).Start();
}
}
В родительском компоненте у меня есть эта функция, запускаемая при обратном вызове события (которая скроет всплывающее окно, обертывающее дочерний компонент, если оно видно):
async void DataObjSelectionChanged(DataObj dataObj)
{
_currentDataObj = dataObj;
if (_showPopup)
{
await InvokeAsync(() =>
{
_showPopup = false;
StateHasChanged();
});
}
}
Тем не менее, я получаю следующую ошибку:
Use InvokeAsync() to switch execution to the Dispatcher when triggering rendering or component state Blazor Server
Кто-нибудь знает, как обойти это? Я думал, что у меня правильный синтаксис, но, видимо, это не так.
1 ответ
Как уже упоминалось выше, вы слишком усложняете это.
[Parameter]
public EventCallback<DataObj> OnDataObjSelection { get; set; }
DataObj _selectedDataObject { get; set; }
object SelectedDataObject
{
get => _selectedDataObject;
set
{
_selectedDataObject = value as DataObj;
OnDataObjSelection.InvokeAsync(_selectedDataObject);
}
}
А также:
private void DataObjSelectionChanged(DataObj dataObj)
{
_currentDataObj = dataObj;
if (_showPopup)
StateHasChanged();
}