【问题标题】:Set EventCallback<string> outside of a Blazor component?在 Blazor 组件之外设置 EventCallback<string>?
【发布时间】: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] 创建事件或事件回调:stackoverflow.com/questions/54496040/…
  • @DataJuggler 不要在 cmets 中发布可能的答案。将其发布为答案,然后您就可以从完整的格式化功能中受益,用户还可以投票、分享等。

标签: c# blazor


【解决方案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 );
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2020-05-11
      • 1970-01-01
      • 2021-02-02
      • 1970-01-01
      • 2021-11-04
      • 1970-01-01
      • 2021-01-30
      • 1970-01-01
      相关资源
      最近更新 更多