我想不出如何实现以下目标:
我需要将参数集合(或数组)传递给我的Blazor组件。传递的参数是Blazor组件。参数的集合必须作为嵌套标记传递。必须能够分别调用每个传递的参数组件的呈现。
也就是说,我想要这样的东西:
<MyComponent>
<ParameterCollection>
<MyParameterComponent1>Caption1</MyParameterComponent1>
<MyParameterComponent2>Caption2</MyParameterComponent2>
<MyParameterComponent3>Caption3</MyParameterComponent3>
</ParameterCollection>
</MyComponent>
MyComponent代码:
@code{
[Parameter]
public RenderFragment[] ParameterCollection {get; set;} //Runtime error
}
我想得到的显然是在commercial Blazor component处实现的(选择VIEW SOURCE选项卡)。 GridColumns参数传递给GridColumn组件的集合。我认为更准确地说,它是它们对应的RenderFragments的集合。 问题是如何完成?
答案 0 :(得分:5)
Blazor无法获取渲染片段的集合作为参数。您可以通过两种不同的方法将动态组件计数作为参数传递
<MyComponent>
<ParameterCollection>
<MyParameterComponent1>Caption1</MyParameterComponent1>
<MyParameterComponent2>Caption2</MyParameterComponent2>
<MyParameterComponent3>Caption3</MyParameterComponent3>
</ParameterCollection>
</MyComponent>
@code{
[Parameter]
public RenderFragment ParameterCollection {get; set;}
}
,您可以渲染它们,将@ParameterCollection
放置在.razor
文件中的任何位置。
以下是此方法的一个有效示例:https://blazorrepl.com/repl/QaFEadlQ52kWHVkX13
在这种方法中,您仅使用该组件传递一些元数据-类似于@Henk Holterman的建议:
<MyComponent>
<ParameterCollection>
<MyParameterComponent1>Caption1</MyParameterComponent1>
<MyParameterComponent2>Caption2</MyParameterComponent2>
<MyParameterComponent3>Caption3</MyParameterComponent3>
</ParameterCollection>
</MyComponent>
@code{
[Parameter]
public RenderFragment ParameterCollection {get; set;}
}
这样,您可以将@ParameterCollection放在.razor
文件的开头,该文件包装在Parent组件的CascadingValue中。这将触发所有子组件的渲染。
在每个组件的初始化中,您需要触发向父级填充元数据:
@code {
[CascadingParameter]
private MyComponent Parent { get; set; }
protected override void OnInitialized()
{
if (Parent != null) Parent.AddChild(this);
}
}
收到元数据后,您只需再次触发渲染并在
中使用此数据答案 1 :(得分:4)
转过来:DatagGridColumnCollection组件将自己插入为CascadingValue,而DatagGridColumn组件仅调用Add方法。
<CascadingValue Value="this">
@ChildContent
</CascadingValue>
@code
{
public void Add(DataGridColumn colum) { ... }
}
@code {
[CascadingParameter]
private ColumnCollection Parent { get; set; }
protected override void OnInitialized()
{
if (Parent != null) Parent.Add(this);
}
}