【问题标题】:EventCallback vs Action not working in blazorEventCallback vs Action 在 blazor 中不起作用
【发布时间】:2021-04-26 01:14:53
【问题描述】:

我正在尝试使用嵌套组件构建概念证明。

我有一个主组件,声明如下

public abstract class VoidHtmlComponent : ComponentBase
{
    [Parameter] public EventCallback<MouseEventArgs> OnClick { get; set; }
}

然后我将TableHead 的实例传递给我的Table 组件

<Shared.RazorComponents.Table TableHead="@(new TableHead{ OnClick = HandleTableHeadClick})" >
</Shared.RazorComponents.Table>

@code{
    private void HandleTableHeadClick(MouseEventArgs mouseEventArgs)
    {
        Trace.WriteLine($"TableHead has been clicked ...");
    }
}

这不会建立说明

Client\Pages\Table.razor(6,213):错误 CS0428:无法将方法组“HandleTableHeadClick”转换为非委托类型“EventCallback”。您是否打算调用该方法?

我猜 blazor 在这里做了一些魔术来将 Action&lt;MouseEventArgs&gt; 转换为 EventCallback&lt;MouseEventArgs&gt; 但我被困在这一点上。我还将参数更改为Action&lt;MouseEventArgs&gt;,这会在运行时引发错误,提示强制转换无效。

已经尝试使用 EventCallbackFactory 但也卡在那里了。

使用OnClick = new EventCallbackFactory().Create(this, HandleTableHeadClick) 抛出

函数语句需要函数名

在运行时。

【问题讨论】:

  • 如果您将OnClick = HandleTableHeadClick 更改为OnClick = e =&gt; HandleTableHeadClick(e) 是否有效?
  • @Ben 在构建期间抛出 Client\Pages\Table.razor(6,213): Error CS1660: Cannot convert lambda expression to type 'EventCallback&lt;MouseEventArgs&gt;' because it is not a delegate type

标签: c# blazor webassembly


【解决方案1】:

我认为问题在于您创建了一个 TableHead 的实例,就像一个属性一样。 由于我们对 Table 组件本身一无所知,我只是假设问题就在那里。

在这种情况下使用Renderfragments 的标记应该是这样的:

<Shared.RazorComponents.Table>
    <TableHead Context="context">
         <p>put what ever you want to render here. Like the nested component with event handler</p>
    </TableHead>
</Shared.RazorComponents.Table>

请参阅docs 作为参考。

【讨论】:

  • 我知道要使用 RenderFragment。是的。 TableHeadTable 组件的属性。我不会使用RenderFragment,因为头部的内容是在Table 中从给定的Column-items 列表中动态生成的
猜你喜欢
  • 2021-08-25
  • 1970-01-01
  • 1970-01-01
  • 2021-04-09
  • 2020-05-06
  • 2021-07-02
  • 2021-01-30
  • 2021-02-02
  • 2020-05-11
相关资源
最近更新 更多