在 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
这似乎行得通,但我很好奇为什么我不能使用接口来做到这一点。
还发现:
- 有关使用接口实现类事件构造的各种文章,或帮助使用 EventHandler,这不是一回事。
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";
在 Blazor 中,EventCallback 结构与标准事件有点不同,是单播而不是多播等。因此,我不认为这是重复的。
我正在尝试创建一组组件,它们都具有相同的 [parameter] EventCallback,使用接口来强制执行似乎是合理的...到目前为止,这似乎是不可能的。
我尝试过的事情:
像 EventHandler 一样处理这个
public interface IResolver
{
event EventCallback Done;
}
这会引发错误:事件必须是委托类型。
...以及尝试使它像 EventHandler 一样工作的其他变体。
正在尝试使用 IEventCallback
EventCallback 实现了 IEventCallback,所以这看起来很有希望。不过是内部接口,我用不到。
改用基数 class
这似乎行得通,但我很好奇为什么我不能使用接口来做到这一点。
还发现:
- 有关使用接口实现类事件构造的各种文章,或帮助使用 EventHandler,这不是一回事。
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";