将带有typeparam的复杂类型作为CascadeParameter传递给子RenderFragment

时间:2019-09-28 21:16:29

标签: c# .net blazor blazor-server-side

我有一个Blazor组件“ Table”,它带有一个RenderFragment参数“ TableHeader”,其中包含TableHeaderColumn个元素的集合。这是Table组件的示例用法:

<Table Items="@Persons">
    <TableHeader>
        <TableHeaderColumn Label="First Name" />
        <TableHeaderColumn Label="Last Name" />
    </TableHeader>
    <TableRow>
    ......
    </TableRow>
</Table>

我想使用CascadingValue,将Table实例传递给“ TableHeader”渲染片段中的所有TableHeaderColumn实例,但是由于某种原因,我无法使它正常工作。

我的理论是,只要Table组件正在使用TItem typeparam,而TableHeaderColumn组件却没有,这是不可能的。

这是Table.razor文件:

@typeparam TItem
@inherits TableBase<TItem>

<table>
   <thead>
      <tr>
         <CascadingValue Value="this">
            @TableHeader
         </CascadingValue>
      </tr>
   </thead>
   <tbody>
   ....
   </tbody>
 </table>

TableBase.cs:

public class TableBase<TItem>
{
    [Parameter]
    public RenderFragment TableHeader { get; set; }

    [Parameter]
    public RenderFragment<TItem> TableRow { get; set; }
}
public class TableHeaderColumnBase
{
    [CascadingParameter]
    public Table<object> Table { get; set; }
}

如您所见,由于TableHeaderColumn组件未使用typeparam,因此我将“对象”用作表类型。不确定这是否是正确的方法。

TableHeaderColumnBase中的级联参数未填充,我不确定如何使它起作用。

如果我改为通过Table实例上的属性之一,例如“ this.Title”,则效果很好。

有人知道我在想什么,或者甚至可以做到吗?

1 个答案:

答案 0 :(得分:0)

您需要将TItem元素传递给TableHeaderColumnBase组件

<Table Items="@Persons">
<TableHeader>
    <TableHeaderColumn TItem="Person" Label="First Name" />
    <TableHeaderColumn TItem="Person" Label="Last Name" />
</TableHeader>
<TableRow>
......
</TableRow>

在TableHeaderColumn.razor文件中,添加一个参数

 [CascadingParameter] public Table<TItem> ParentTable { get; set; }

@typeparam TItem在顶部。

您现在可以调用所有方法并访问父组件的变量,并根据需要使用TItem。