I want to use DataGrid Column cell Template dynamically

I got a custom DataGrid component that takes parameters. It's kind of an adapter for RadzenDataGrid. I want to take HeaderTemplate and Template parameters from outside. I make HeaderTemplate work but not Template. Is there a better way to implement both? If there is no Template provided, I want to use default.

Templates are RenderFragment type.

<RadzenDataGridColumn TItem="TItem"
                      @attributes="GetAttributes(Header.PropertyName)"
                      Title=@Header.Title
                      Width="@(@Headers.IndexOf(Header) == 0 ? "150px" : "")">
    <HeaderTemplate>
        @if (Header.HeaderTemplate is not null)
        {
            @Header.HeaderTemplate
        }
        else
        {
            @(columnInstance.HeaderTemplate)
        }
    </HeaderTemplate>
    <Template Context="context">
        @if (Header.CellTemplate is not null)
        {
            @Header.CellTemplate(context)
        }
        else
        {
            @(columnInstance.Template(context))
        }
    </Template>
</RadzenDataGridColumn>

You cannot assign Template conditionally in razor - the only way is to create everything with code and use RenderFragment.

1 Like

This solved it. Thank you.

private RenderFragment columnBuilder(HeaderDataTable header)
{
    return builder =>
    {
        int seq = 0;
        builder.OpenComponent(seq++, typeof(Radzen.Blazor.RadzenDataGridColumn<TItem>));
        builder.AddAttribute(seq++, "Title", header.Title);

        var attributes = GetAttributes(header.PropertyName);
        foreach (var attr in attributes)
        {
            builder.AddAttribute(seq++, attr.Key, attr.Value);
        }

        if (header.HeaderTemplate is not null)
        {
            builder.AddAttribute(seq++, "HeaderTemplate", header.HeaderTemplate);
        }

        if (header.CellTemplate is not null)
        {
            builder.AddAttribute(seq++, "Template", (RenderFragment<TItem>)(item =>
                item is null
                ? builder => { }
                : header.CellTemplate!(item)));
        }

        builder.CloseComponent();
    };
}