gpt4 book ai didi

c# - Blazor Dialog EventCallback 在没有参数的情况下工作,但编译器会抛出带参数的 CS1950

转载 作者:行者123 更新时间:2023-12-05 03:32:32 27 4
gpt4 key购买 nike

我正在尝试打开一个带有父对话框回调的子对话框。如果我没有将任何参数从 child 传回给 parent ,我可以让它工作,但是当我尝试将 bool 值从 child 传递给 parent 时,我得到一个编译时错误。

The best overloaded Add method 'name' for the collection initializer has some invalid arguments.

现在很少有关于这个实现的细节来解决这个困难。

我正在使用 Blazor (Net 5) 和 Radzen 组件。 Specifically this one.

Dialog OpenAsync 的第二个参数是 的字典,其中字符串值是子项上参数的名称,对象当然是像字符串这样的值,甚至是复杂的对象。

但是,我正在尝试一些新的东西,因为我的“对象”是一个 EventCallback,它可以在没有任何额外参数的情况下工作,但带有参数似乎不太适合编译器。

没有参数的工作回调

父级

var retval = await DialogService.OpenAsync<ManageSubscriptionDialog>($"Subscription Management",
new Dictionary<string, object>() { { nameof(ManageSubscriptionDialog.SubscriptionStateChanged), UpdateSubscription } },
new DialogOptions() { Width = "600px", Height = "auto" });


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

child

[Parameter]
public EventCallback SubscriptionStateChanged { get; set; }


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

进入兔子洞

父级

var retval = await DialogService.OpenAsync<ManageSubscriptionDialog>($"Subscription Management",
new Dictionary<string, object>() { { nameof(ManageSubscriptionDialog.SubscriptionStateChanged), UpdateSubscription } },
new DialogOptions() { Width = "600px", Height = "auto" });


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

child

[Parameter]
public EventCallback<bool> SubscriptionStateChanged { get; set; }

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

这甚至无法编译,所以我在其中添加了一些语法糖,试图让它开心。

父级

delegate EventCallback<bool> DelegateUpdateSubscription(bool isCancelled);
DelegateUpdateSubscription adfasdf = UpdateSubscription;
var retval = await DialogService.OpenAsync<ManageSubscriptionDialog>($"Subscription Management",
new Dictionary<string, object>() { { nameof(ManageSubscriptionDialog.SubscriptionStateChanged), adfasdf } },
new DialogOptions() { Width = "600px", Height = "auto" });

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

child

[Parameter]
public EventCallback<bool> SubscriptionStateChanged { get; set; }

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

现在可以编译,但在运行时对话框打开时会抛出以下错误。

Unable to set property 'SubscriptionStateChanged' on object of type 'MyApp.Shared.Components.Subscription.ManageSubscriptionDialog'. The error was: Unable to cast object of type 'DelegateUpdateSubscription' to type 'Microsoft.AspNetCore.Components.EventCallback`1[System.Boolean]'.

我不会列出我尝试过的所有内容,我现在正试图弄清楚如何将一个值传递回父级,但我很困惑。

总结

所以在一天结束时,我要做的就是弄清楚如何将参数从子对话框传递回父对话框。

更新

我现在可以在没有错误的情况下打开对话框,只需要弄清楚将变量从子项传回父项的最后一步。

我在这里更新了父代码行。当我应该传递父对象作为回调处理程序时,我传递了 null。

不正确

private EventCallback<bool> UpdateSubscription => new(null, (Action)

正确

private EventCallback<bool> UpdateSubscription => new(this, (Action)

最后更新

正确

private EventCallback UpdateSubscription => new(this, (Action<bool>)(async (bool www) =>

最佳答案

所以编译器错误是由于一些缺失值和不匹配的参数造成的。

这是一个带有参数化回调的工作示例。

需要注意的重要一点是第一个(字符串)值需要与子项中的名称完全匹配。第二个(对象)是父级回调的名称。

ParentComponent.cs

var retval = await DialogService.OpenAsync<ManageSubscriptionDialog($"Subscription Management",
new Dictionary<string, object>() { { "SubscriptionStateChanged", UpdateSubscriptionHandler } },
new DialogOptions() { Width = "600px", Height = "auto" });


private EventCallback UpdateSubscriptionHandler => new(this, (Action<UpdateSubscriptionApiModel>)(async (UpdateSubscriptionApiModel apiModel) =>
{ await UpdateSubscription(apiModel); }));

UpdateSubscriptionApiModel 只是一个 poco,我不会在此处包含它。您可以轻松地使用 bool 或 string 或类似的东西。

此处需要注意 2 项。

  1. lambda 的第一个参数 new(this,.... 在这里您将指定回调的接收者。通常这会在幕后为您处理,但您需要自己编写 lambda解析为参数字典的“对象”。

  2. await UpdateSubscription(apiModel) 是处理回调的实际方法。

    私有(private)异步任务 UpdateSubscription(UpdateSubscriptionApiModel apiModel){ ...做你需要做的.... }

Child.cs

[Parameter]
public EventCallback SubscriptionStateChanged { get; set; }

UpdateSubscriptionApiModel model = new UpdateSubscriptionApiModel();

async Task OnManageSubscriptionSubmit()
{
...do whatever you need on child....
await SubscriptionStateChanged.InvokeAsync(model);
}

就这样吧。如果我对某事不清楚,请发表评论,我会尽可能回复。

关于c# - Blazor Dialog EventCallback 在没有参数的情况下工作,但编译器会抛出带参数的 CS1950,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/70463828/

27 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com