Blazor Dialog EventCallback работает без параметров, но компилятор выдает CS1950 с параметрамиC#

Место общения программистов C#
Ответить
Anonymous
 Blazor Dialog EventCallback работает без параметров, но компилятор выдает CS1950 с параметрами

Сообщение Anonymous »

Я пытаюсь открыть дочерний диалог с обратным вызовом родительского элемента. Я могу заставить его работать, если у меня нет параметров от дочернего элемента, передаваемых обратно родительскому, но когда я пытаюсь передать логическое значение от дочернего элемента к родительскому, я получаю ошибку времени компиляции.

Лучший перегруженный метод Add «name» для инициализатора коллекции имеет несколько недопустимых аргументов.

Теперь их немного подробности об этой реализации, которые играют роль в этой трудности.
Я использую Blazor (Net 5) и компоненты Radzen. В частности, этот.
Вторым параметром Dialog OpenAsync является словарь , где строковые значения — это имена параметров дочернего элемента, а объект, конечно, значение, такое как строка или даже сложный объект.
Однако я пробую что-то новое, поскольку мой «объект» — это EventCallback, который РАБОТАЕТ без каких-либо дополнительных параметров, но с параметрами не кажется, я не очень хорошо сочетаюсь с компилятор.
Рабочий обратный вызов без параметров
Родитель
var retval = await DialogService.OpenAsync($"Subscription Management",
new Dictionary() { { nameof(ManageSubscriptionDialog.SubscriptionStateChanged), UpdateSubscription } },
new DialogOptions() { Width = "600px", Height = "auto" });

private EventCallback UpdateSubscription => new(null, (Action)(async () =>
{
//do stuff
}));

Ребенок
[Parameter]
public EventCallback SubscriptionStateChanged { get; set; }

//throw back to parent to handle selection
await SubscriptionStateChanged.InvokeAsync();

В кроличью нору
Родитель
var retval = await DialogService.OpenAsync($"Subscription Management",
new Dictionary() { { nameof(ManageSubscriptionDialog.SubscriptionStateChanged), UpdateSubscription } },
new DialogOptions() { Width = "600px", Height = "auto" });

private EventCallback UpdateSubscription(bool isCancelled) => new(null, (Action)(async () =>
{
//do stuff
}

Ребенок
[Parameter]
public EventCallback SubscriptionStateChanged { get; set; }

protected async Task InvokeSubscriptionParent(bool isCancelled)
{
//throw back to parent to handle selection
await SubscriptionStateChanged.InvokeAsync(isCancelled);
}

Это даже не скомпилируется, поэтому я добавляю туда немного синтаксического сахара, пытаясь сделать его счастливым.
Родитель
delegate EventCallback DelegateUpdateSubscription(bool isCancelled);
DelegateUpdateSubscription adfasdf = UpdateSubscription;
var retval = await DialogService.OpenAsync($"Subscription Management",
new Dictionary() { { nameof(ManageSubscriptionDialog.SubscriptionStateChanged), adfasdf } },
new DialogOptions() { Width = "600px", Height = "auto" });

private EventCallback UpdateSubscription(bool isCancelled) => new(null, (Action)(async () =>
{
//do stuff
}

Ребенок
[Parameter]
public EventCallback SubscriptionStateChanged { get; set; }

protected async Task InvokeSubscriptionParent(bool isCancelled)
{
//throw back to parent to handle selection
await SubscriptionStateChanged.InvokeAsync(isCancelled);
}

Теперь это компилируется, но во время выполнения, когда открывается диалоговое окно, выдается следующая ошибка.

Невозможно установить свойство SubscriptionStateChanged ' для объекта типа MyApp.Shared.Components.Subscription.ManageSubscriptionDialog. Ошибка: невозможно привести объект типа «DelegateUpdateSubscription» к типу «Microsoft.AspNetCore.Components.EventCallback`1[System.Boolean]».

Я не буду перечислять все, что пробовал, сейчас пытаюсь понять, как передать значение обратно родителю, и я в тупике.
Резюме
Итак, в конце концов, все, что я пытаюсь сделать, это выяснить, как передать параметры из дочернего диалога обратно в родительский.
Обновление
Теперь у меня открывается диалоговое окно без ошибок, просто нужно выяснить последний шаг, когда переменные передаются от дочернего элемента обратно к родительскому.
Здесь я обновил родительскую строку кода. Я передал значение null, хотя следовало передать родительский объект в качестве обработчика обратного вызова.
Неверно
private EventCallback UpdateSubscription => new(null, (Action)

Правильно
private EventCallback UpdateSubscription => new(this, (Action)

Окончательное обновление
Правильно
private EventCallback UpdateSubscription => new(this, (Action)(async (bool www) =>


Подробнее здесь: https://stackoverflow.com/questions/704 ... ows-cs1950
Ответить

Быстрый ответ

Изменение регистра текста: 
Смайлики
:) :( :oops: :roll: :wink: :muza: :clever: :sorry: :angel: :read: *x)
Ещё смайлики…
   
К этому ответу прикреплено по крайней мере одно вложение.

Если вы не хотите добавлять вложения, оставьте поля пустыми.

Максимально разрешённый размер вложения: 15 МБ.

Вернуться в «C#»