Используйте InvokeAsync() для переключения выполнения на Dispatcher при запуске рендеринга или состояния компонента.

У меня есть дочерний компонент в Blazor Server, который отображает таблицу. При щелчке строки в этой таблице у меня есть следующий метод обработчика и обратный вызов события для отправки данных родительскому компоненту (который заключает дочерний компонент во всплывающее окно, которое необходимо переключать при поступлении новых данных).

В get/set исходит от DevExpress, и я не могу сделать этот метод асинхронным, не вызывая ошибки, но для обратного вызова события требуется асинхронность.

      [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();
}
Другие вопросы по тегам