给定以下EventCallback定义

public EventCallback<MenuAction<TRowData>> OnMenuItemClicked { get; set; } = default!;

此处理程序:

private void OnMenuItemClicked(MenuAction<UserQualificationVM> action)

和此活动订阅:

<SearchResultsGridComponent OnMenuItemClicked="@((action) => OnMenuItemClicked(action))">

我明白错误所在

Argument 1: cannot convert from 'object' to MenuAction < UserQualificationVM > '

如果将EventCallback的签名更改为

private void OnMenuItemClicked(object)

并修改所有相关代码,我不明白这个错误.

我的问题是,这种类型的带有类型化对象的EventCallback定义实际上是允许的吗?如果是这样的话,我做错了什么?

MenuAction定义如下:

    public class MenuAction<TRowData>
{
    public int ActionId { get; set; }
    public string MenuText { get; set; } = "";

    public Expression<Func<TRowData, bool>>? PredicateExpression { get; set; }

    public string ShowMenuItemPredicate { get; set; } = default!;

    public object? Data { get; set; }
}

MenuAction项的列表被传递到网格组件中,并且网格组件本身被提供了一个类型参数(在本例中是UserQualificationVM).

栅格组件的定义如下:

[CascadingTypeParameter(nameof(TRowData))]
public partial class SearchResultsGridComponent<TRowData>
{
     [Parameter]
    public ICollection<TRowData> Items { get; set; } = default!;
}

网格是按如下方式在HTML中构建的:

<SearchResultsGridComponent Items="UserQualificationVMs" OnMenuItemClicked="@((action) => OnMenuItemClicked(action))">

    <SearchResultsGridColumnBase Expression="e => e.QualTypeTitle" Title="Qualification Type" />
    <SearchResultsGridColumnBase Expression="e => e.QualName" Title="Title" />
    <SearchResultsGridColumnBase Expression="e => e.DateAttained" Title="Date Achieved" ColumnDataType="GridColumnDataType.ShortDate" />
    <SearchResultsGridColumnBase Expression="e => e.BodyName" Title="Awarding Body" />
    <SearchResultsGridColumnBase Expression="e => e.QualGrade" Title="Grade" />
    <SearchResultsGridColumnBase Expression="e => e.QualPlaceOfStudy" Title="Place of Study" />
    <SearchResultsGridKebabMenuColumn MenuActions="_menuActions" Title="KebabMenu" ShowInColumnSelector=false ShowTitleInHeader=false />

</SearchResultsGridComponent>

网格中的Razor遍历其行,并通过重写各行的RenderFragment方法来呈现所提供的HTML.在烤肉菜单列的情况下,代码如下:

internal override RenderFragment<TRowData> CellTemplate
{
    get
    {
        return cellTemplate ??= (rowData => builder =>
        {
            BuildCellTemplate(rowData, builder);

        });
    }
}

private void BuildCellTemplate(TRowData rowData, RenderTreeBuilder builder)
{
//Open TD element
StartTableCell(builder, rowData, "KebabMenu");

builder.OpenElement(0, "div");

builder.OpenElement(2, "button");
builder.AddAttribute(3, "type", "button");
builder.CloseElement();

builder.OpenElement(4, "ul");

int index = 0;

foreach (var menuAction in MenuActions)
{
    if (menuAction.PredicateExpression is not null)
    {
        if (!menuAction.PredicateExpression.Compile()(rowData))
        {
           continue;
         }
        builder.OpenElement(5, "li");
        builder.OpenElement(6, "a");
        builder.AddAttribute(7, "href", "#");
        builder.AddEventPreventDefaultAttribute(8, "onclick", true);
        builder.AddAttribute(8, "onclick", new EventCallbackFactory().Create(this, (args) => MenuItemClicked(menuAction, rowData)));
        builder.AddContent(9, menuAction.MenuText);
        builder.CloseElement();
        builder.CloseElement();

        index++;
    }

    builder.CloseElement();

    builder.CloseElement();

    //Close TD element
    EndTableCell(builder);
}

private void MenuItemClicked(MenuAction<TRowData> action, TRowData rowData)
{
    action.Data = rowData;
    OwnerGrid.MenuItemClicked(action);
}

正如您所看到的,烤肉串菜单列创建了一个事件回调,该事件回调调用所属网格.所属网格然后触发它自己的事件回调:

internal async Task MenuItemClicked(MenuAction<TRowData> action)
{
    await OnMenuItemClicked.InvokeAsync(action);
}

推荐答案

您必须定义TRowData类型,如建议的SMSTJ:

<SearchResultsGridComponent TRowData="UserQualificationVM"
                            Items="UserQualificationVMs"
                            OnMenuItemClicked="OnMenuItemClicked">
    ...
</SearchResultsGridComponent>

Csharp相关问答推荐

我应该将新的httpReportMessage()包装在using声明中吗?

图形.DrawString奇怪异常的字距调整

如何使用C#中的图形API更新用户配置文件图像

LINQ无法翻译SQLFunctions方法

什么是通过反射创建类的泛型接口方法的正确方法?

Blazor Foreach仅渲染最后一种 colored颜色

如何在没有额外副本的情况下将存储在IntPtr下的原始图像数据写入WinUI3中的Image控件?

当前的文化决定了错误的文化

什么时候接受(等待)信号灯?尽可能的本地化?

在C#中,是否有与变量DISARD对应的C++类似功能?

为什么ReadOnlySpan;T&>没有Slice(...)的重载接受Range实例的?

未在Windows上运行的Maui项目

如何从非异步任务中正确返回TypeResult

流畅的验证--如何为属性重用规则?

正在try 将自定义字体添加到我的控制台应用程序

数据库操作预计影响1行,但实际影响0行; after _dbContext.SaveChanges();

如何在Xamarin.Forms中检索PanGesture事件的位置?

如何在.NET MAUI上在iOS和Mac之间共享代码?(no条件编译和无代码重复)

在使用xUnit和Mock执行单元测试时,控制器ViewResult返回空的Model集合

能否将我图表中的星号与X轴上一天中的第二位数字对齐?