【问题标题】:Blazor Pass EventCallback as Class Property To ComponentBlazor 将 EventCallback 作为类属性传递给组件
【发布时间】:2021-01-30 18:22:53
【问题描述】:

我正在尝试在 Blazor 中开发一个组件,我希望它能够从 C# 类中获取其所有功能(文本、EventCallbacks 等)。像这样的:

Blazor 组件(代码隐藏):

public partial class Card : ComponentBase
{
    [Parameter] public CardData CardData { get; set; }

    protected async Task OnActionFiredEvent(EventCallback<object> eventCallback, object itemId)
    {
        if (eventCallback.HasDelegate)
            await CardData.CardTitleOnClickAction.InvokeAsync(itemId);
    }
}

Blazor 组件(Razor):

<!-- Card image -->
<div class="view view-cascade overlay">
    <a>
        <div class="mask rgba-white-slight waves-effect waves-light"></div>
    </a>
</div>

<!-- Card content -->
<div class="card-body card-body-cascade text-center">

    <!-- Title -->
    <h4 class="card-title">
        <a class="waves-effect waves-light" @onclick="@(() => OnActionFiredEvent(CardData.CardTitleOnClickAction, CardData.CardItemId))">
            <strong>@CardData.CardTitle</strong>
        </a>
    </h4>
    <!-- Subtitle -->
    @if (!string.IsNullOrEmpty(CardData.CardSubTitle))
    {
        <h6 class="font-weight-bold indigo-text py-2">@CardData.CardSubTitle</h6>
    }

    <!-- Text -->
    @if (!string.IsNullOrEmpty(CardData.CardText))
    {
        <p class="card-text">
            @CardData.CardText
        </p>
    }
</div>

<!-- Card footer -->
<div class="card-footer text-muted text-center">
    @CardData.CardFooter
</div>

CarData 类:

public class CardData
{
    public object CardItemId { get; set; }
    public string CardTitle { get; set; }
    public string CardSubTitle { get; set; }
    public string CardText { get; set; }
    public string CardFooter { get; set; }
    public EventCallback<object> CardTitleOnClickAction { get; set; }
}

用途:

<Card CardData="@(new CardData() {
CardTitle = "TextTitle",
CardTitleOnClickAction = EventCallBackMethod,
CardSubTitle = "TextSubTitle",
CardText = "Text"})" />

问题是在将 EventCallBack 作为类属性传递时出现以下错误: 无法将方法组“EventCallBackMethod”转换为非委托类型“EventCallback”。您是否打算调用该方法?

失败的方法本身是这样的:

protected async Task EventCallBackMethod()
    {
        await DoSomething();
    }

知道如何解决这个问题吗?

【问题讨论】:

  • EventCallback 你的方法应该有一个对象类型的参数
  • 感谢@BrianParker 的评论,作为测试,我尝试了以下代码:CardTitleOnClickAction = EventCallBackMethod(1)。但现在我收到错误:无法将类型“System.Threading.Tasks.Task”隐式转换为“Microsoft.AspNetCore.Components.EventCallback
  • 你能做一个简单的示例项目吗?看起来该代码应该可以工作或非常接近。

标签: c# blazor


【解决方案1】:

正如 Brian Parker 所说,您需要在回调中有一个类型。如果不想传递值,可以传递null,例如;

MyComponent.razor

<button @onclick="OnButtonClicked">Click me</button>

@code{
    [Parameter]
    public EventCallback ButtonClicked{ get; set; }


    protected async Task OnButtonClicked()
    {
        await ButtonClicked.InvokeAsync(null);
    }
}

例如作为剃须刀组件,按钮点击触发OnButtonClicked,然后调用ButtonClicked参数,可以在父页面中引用。

Page.razor

@page "/pagename"

<MyComponent ButtonClicked="@ButtonClickedHandler" />

@code{
    protected void ButtonClickedHandler()
    {
        Logger.LogInfo("Button click was handled on the page");
    }
}

如果你想传递参数,你可以像下面这样;

MyNextComponent.razor

<button @onclick="OnButtonClicked">Click me</button>

@code{
    [Parameter]
    public EventCallback<bool> ButtonClicked{ get; set; }

    protected async Task OnButtonClicked(bool value)
    {
        await ButtonClicked.InvokeAsync(true);
    }
}

Page.razor @page "/pagename"

<MyNextComponent ButtonClicked="@ButtonClickedHandler" />

@code{
    protected void ButtonClickedHandler(bool value)
    {
        Logger.LogInfo($"Button click was handled on the page: {value}");
    }
}

【讨论】:

  • 感谢您的示例,但我认为这不能回答原始问题。我知道如何将 EventCallback 作为参数传递给 Blazor 组件(如您在此处所示)。我不知道的是如何将该 EventCallback 方法作为属性传递给作为组件参数的对象内
  • 您是否尝试过将此代码移动到“代码隐藏”文件中?我希望它能够正常工作。
  • 是的,它都在 (.razor.cs) 文件后面的代码中,问题是我有一个 CardData 类,其属性类型为 EventCallBack,我不知道当用户触发组件中的事件时,如何使用我想要执行的方法设置该属性。不知道有没有可能
  • 您是想将CardData 传回EventCallback,还是什么都不传回去?
  • CardData 有一个 ItemId,当事件被触发时,我只想要那个 Id。类似于 EventCallBackMethod.InvokeAsync(itemId) 的内容,如我在“Blazor 组件(代码隐藏)”标签下添加的代码示例中
【解决方案2】:

像这样创建您的 EventCallback

    private async Task Press1()
    {
        this.message = "F1";
    }

EventCallback evt1 = EventCallback.Factory.Create(this, Press1);

财产

public class CardData
{
    public EventCallback<object> CardTitleOnClickAction { get; set; }
    public static EventCallback GetEvent(CardData data)
    {
        return data.CardTitleOnClickAction;
    }
}

评论

@onclick="() =>Modal.CardData.GetEvent(data).InvokeAsync()"

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2023-03-20
    • 2018-05-13
    • 1970-01-01
    • 2016-08-20
    • 1970-01-01
    • 2011-08-15
    • 2021-01-18
    相关资源
    最近更新 更多