如何将 RenderFragement<object> 模板传递给 Blazor 组件

How to pass a RenderFragement<object> Template to a Blazor component

我坚持做一件特别的事情,我尝试将 RenderFragment 的对象传递给动态生成的组件。

我考虑了来自 Devexpress 的这个示例 https://docs.devexpress.com/Blazor/401753/common-concepts/customize-and-reuse-components

<DxFormLayout>
    <DxFormLayoutTabPages>
        @renderLayoutTabPage()
    </DxFormLayoutTabPages>
</DxFormLayout>

@code {
    private RenderFragment renderLayoutTabPage() {
        RenderFragment item = b => {
            b.OpenComponent<DxFormLayoutTabPage>(0);
            b.AddAttribute(1, "Caption", "My tab");
            b.AddAttribute(2, "ChildContent", (RenderFragment)((tabPageBuilder) => {
                tabPageBuilder.OpenComponent<DxFormLayoutItem>(0);
                tabPageBuilder.AddAttribute(1, "Caption", "DynLayoutItem");
                tabPageBuilder.AddAttribute(2, "ColSpanMd", 6);
                tabPageBuilder.AddAttribute(5, "Template", (RenderFragment<Object>)((context) => ((itemTemplate) => {
                    itemTemplate.OpenComponent<DxTextBox>(0);
                    itemTemplate.AddAttribute(1, "Text", text);
                    itemTemplate.CloseComponent();
                })));
                tabPageBuilder.CloseComponent();
            }));
            b.CloseComponent();
        };
        return item;
    }
}

这就是他们构建全新 ChildContent 片段的方式。

我的剃刀文件看起来像:

    [Parameter] RenderFragment<object> DisplayTemplate {get;set;} //pass this Fragement to the dynamic component
    
    protected override void OnInitialized()
    {
      ...        
      b.AddAttribute(3, nameof(DxDataGridColumn.DisplayTemplate), (RenderFragment<Object>)((context) => ((itemTemplate) =>
                                {
                                    itemTemplate.AddContent<object>(0, DisplayTemplate, context);
                                })));
       ...
    }

当我 运行 这样做时,DisplayTemplate 不会被渲染。我只能看到类型字符串“Microsoft.AspNetCore.Components.RenderFragment`1[System.Object]”

我哪里做错了?

知道了!

在我的组件中我使用了这个模式

<MyComponent>
  <DisplayTemplate>
    @DisplayTemplate
  </DisplayTemplate>
<MyComponent>

唯一正确的方法是直接使用属性:

<MyComponent DisplayTemplate"@DisplayTemplate" />