在 Blazor 中,如何使用 EventCallback 创建接口?

In Blazor, how can I create an interface with EventCallback?

在 Blazor 中,EventCallback 结构与标准事件有点不同,是单播而不是多播等。因此,我不认为这是重复的。

我正在尝试创建一组组件,它们都具有相同的 [parameter] EventCallback,使用接口来强制执行似乎是合理的...到目前为止,这似乎是不可能的。

我尝试过的事情:

像 EventHandler 一样处理这个

public interface IResolver
{
    event EventCallback Done;
}

这会引发错误:事件必须是委托类型。

...以及尝试使它像 EventHandler 一样工作的其他变体。

正在尝试使用 IEventCallback

EventCallback 实现了 IEventCallback,所以这看起来很有希望。不过是内部接口,我用不到。

改用基数 class

这似乎行得通,但我很好奇为什么我不能使用接口来做到这一点。

还发现:

None 似乎与此问题有关。

使用正确的语法声明回调,它将起作用。

这是我的测试代码。

using Microsoft.AspNetCore.Components;

namespace TestBlazorServer
{
    public interface ICallbackComponent
    {
        public EventCallback MyCallBack { get; set; }
    }
}
// TestCallback.razor
@namespace  TestBlazorServer

@implements ICallbackComponent
<h3>TestCallback</h3>

<button class="btn btn-danger" @onclick="() => this.CallCallback()">Test Me</button>

我们现在声明 MyCallBack[Parameter]

using Microsoft.AspNetCore.Components;

namespace TestBlazorServer
{
    public partial class TestCallback : ComponentBase, ICallbackComponent
    {
        [Parameter] public EventCallback MyCallBack { get; set; }

        private void CallCallback()
        {
            MyCallBack.InvokeAsync();
        }
    }
}

而且我们可以在index.razor中声明多个实例。

// index.razor
<TestCallback MyCallBack="Callback1"></TestCallback>

<TestCallback MyCallBack="Callback2"></TestCallback>

<TestCallback MyCallBack="Callback3"></TestCallback>

<div>Test:@called</div>

@code {
    private string called;

    private void Callback1()
        => called = "First";

    private void Callback2()
        => called = "Second";

    private void Callback3()
        => called = "Third";