给定以下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);
}