c# - 在 blazor 中将方法作为参数传递

我正在将父 Blazor 组件中的方法传递给子组件。

父定义如下所示:

public bool AddOrUpdate(MyModel myModel)
{ 
    // do stuff
        
    return true;
}

ChildComponent.razor.cs 中它看起来像:

[Parameter]
public EventCallback<MyModel> SaveMethod { get; set; }

它从父母传递给孩子,例如:

<ChildComponent SaveMethod="@AddOrUpdate" />

当我使用在孩子中调用方法时

SaveMethod(newNote);

它抛出:

Non invocable member cannot be used like a method

有什么问题?

编辑:使用 invoke 帮助我克服了最初的错误,但现在我看到了 CS1503 Argument 2: cannot convert from 'method group' to 'EventCallback'

回答1

SaveMethod 是一个属性。您应该改用 SaveMethod.InvokeAsync(newNote); (如果您在异步方法中,请添加 await )。

阅读更多关于事件回调的信息https://docs.microsoft.com/en-us/aspnet/core/blazor/components/event-handling?view=aspnetcore-6.0#eventcallback

回答2

这不是航天科技。将 EventCalback 方法模式与分配的方法匹配,它就可以工作。

这是 Enet 答案的完整工作版本:

该模型。

public class MyModel
    {
        public string? Name { get; set; }
    }

组件

<button @onclick="SaveModel">Save</button>

@code {
    private MyModel _myModel => new MyModel() { Name= $"clicked at {DateTime.Now.ToLongTimeString()}" };

    [Parameter]
    public EventCallback<MyModel> SaveMethod { get; set; } 

    private void SaveModel()
    {
        // Invoke the parent's AddOrUpdate, passing it an instance of 
        // MyModel 
        SaveMethod.InvokeAsync(_myModel);
    } 
}

和索引页面演示

@page "/"

<PageTitle>Index</PageTitle>

<MyComponent SaveMethod="this.AddOrUpdate" />

<div class="p-2">
    @model.Name
</div>

@code {
    MyModel model = new MyModel();

    public void AddOrUpdate(MyModel myModel)
    {
        model = myModel;
    }
}

相似文章

c# - 子组件在父组件之前初始化

我已经实现了一个状态容器,以便父页面将状态传递给2个子组件,子组件可以更新状态并且父组件会知道这些更改。这是我的状态容器(它被注册为单例并注入到父组件和子组件中):publicclassEditSta...