【问题标题】:Pass complex type with typeparam to child RenderFragment as CascadeParameter将具有 typeparam 的复杂类型作为 CascadeParameter 传递给子 RenderFragment
【发布时间】:2020-01-28 17:07:24
【问题描述】:

我有一个带有 RenderFragment 参数“TableHeader”的 Blazor 组件“Table”,其中包含 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-instance 上的属性之一,例如“this.Title”,它可以正常工作。

任何人都知道我错过了什么,或者这是否可能做到?

【问题讨论】:

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


    【解决方案1】:

    您需要将 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。

    【讨论】:

      猜你喜欢
      • 2011-07-10
      • 1970-01-01
      • 1970-01-01
      • 2021-02-23
      • 2016-10-01
      • 2021-10-19
      • 2013-10-18
      • 1970-01-01
      • 2022-01-05
      相关资源
      最近更新 更多