繁体   English   中英

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

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

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

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

我尝试过的事情:

像 EventHandler 一样对待它

public interface IResolver
{
    event EventCallback Done;
}

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

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

尝试使用 IEventCallback

EventCallback 实现了 IEventCallback,所以这看起来很有希望。 但是,它是一个内部接口,对我不可用。

使用基础 class 代替

这似乎可行,但我很好奇为什么我不能用界面来做到这一点。

还发现:

这些似乎都与这个问题无关。

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

这是我的测试代码。

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>

我们现在用[Parameter]声明MyCallBack

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";

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM