在 Blazor 组件之外设置 EventCallback<string>?

Posted

技术标签:

【中文标题】在 Blazor 组件之外设置 EventCallback<string>?【英文标题】:Set EventCallback<string> outside of a Blazor component? 【发布时间】:2020-05-06 01:01:51 【问题描述】:

我正在构建一个 Blazor ProgressBar 演示,并尝试将一些代码从我的 Blazor 组件移到一个名为 ProgressManager 的 C# 类中。这样我就可以抽象代码并使 ProgressManager 成为 ProgressBar 组件的CascadingParameter

我知道如何为这样的组件设置EventCallback 参数:

[Parameter]
public EventCallback<string> UpdateNotification  get; set; 

我不知道如何在 C# 类上设置相同类型的属性。

我的 Start 方法中有这段代码:

public void ShowProgressSimulation()

    // Create a ProgressManager
    this.ProgressManager = new ProgressManager();
    this.ProgressManager.UpdateNotification = Refresh;
    this.ProgressManager.Start();
    
    // Refresh the UI
    StateHasChanged();

不起作用的部分是: this.ProgressManager.UpdateNotification = Refresh;

错误是:

无法将方法组“Refresh”转换为非委托类型“EventCallback”。您是否打算调用该方法?

我也试过: this.ProgressManager.UpdateNotification += Refresh;

这导致“EventCallback 无法应用于方法组”(释义)。

【问题讨论】:

我解决了我的问题,但我没有回答这个问题,所以我会留下这个问题,以防万一有人能回答,所以我知道。我的问题是我需要一种在进度条的值更改时获取通知的方法,以便我可以更新 UI。我只是通过使用 1 种方法 Refresh 创建一个接口来解决我的问题。然后,当我创建我的 ProgressManager 时,我将 Blazor 页面设置为订阅者(如果需要,它可以很容易地成为一个列表): this.ProgressManager = new ProgressManager(); this.ProgressManager.Subcriber = this; 是否有一个技巧可以让注释中的代码成为行格式,而不是像段落一样包装所有内容?上面的消息是用许多换行符输入的。 注意:EventCallback 是一个被发明来改变事件目标的结构。它不是委托类型。我认为您不应该将“ProgressManager 作为 ProgressBar 组件的级联参数”。我建议您将 ProgressManager 设为一项服务,该服务可以注入到使用 ProgressBar 组件的组件中,控制并为其提供状态管理和其他潜在功能。 还要注意,将 ProgressManager 公开为级联参数将需要您定义一个公开它的类。 [这里是指向][1] 代码的链接,该代码定义了一个名为 NewsProvider 的服务,其中包含由组件处理的事件。你可能需要类似的东西。要点是您不要使用 EventCallback 'delegate' [1] 创建事件或事件回调:***.com/questions/54496040/… @DataJuggler 不要在 cmets 中发布可能的答案。将其发布为答案,然后您就可以从完整的格式化功能中受益,用户还可以投票、分享等。 【参考方案1】:

事实证明,您可以像这样从 C# 代码中分配事件回调:

this.ProgressManager.UpdateNotification = new EventCallback(this, (Action)Refresh);

void Refresh() 

它也适用于异步方法,例如:

this.ProgressManager.UpdateNotification = new EventCallback(this, (Func<ValueTask>)RefreshAsync);

ValueTask RefreshAsync() 

更新

您也可以使用EventCallbackFactory更方便地创建事件回调对象,例如:

new EventCallbackFactory().Create(this, Refresh)

【讨论】:

【参考方案2】:

您也可以使用以下代码通过工厂创建EventCallBack,而无需新建EventCallbackFactory

Button.Clicked = EventCallback.Factory.Create( this, ClickHandler );

【讨论】:

以上是关于在 Blazor 组件之外设置 EventCallback<string>?的主要内容,如果未能解决你的问题,请参考以下文章

Blazor University (11)组件 — 替换子组件的属性

如何以不同方式设置 Blazor 组件的样式

身份剃须刀页面中的 Blazor 组件

首次渲染时 Blazor 组件引用为空

在 Blazor 中的视图之外访问经过身份验证的用户

Blazor VS Vue