问题描述
我一直在做一件特别的事情,我尝试将 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,"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 Fragment 的方式。
我的剃刀文件看起来像:
[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" />