Search code examples
c#blazorradzen

Dynamic type parameter for Blazor components


I want to design a common radzen data grid for multiple data types. Which means on the razor page I have common markup for radzen data grid. Record set and column definition bind to the grid dynamically. My problem is with ‘TItme’.

I need something like:

TItem="typeof(data.records[0])"

Datagrid as follows:

<RadzenDataGrid FilterMode="FilterMode.Simple" Data="@data.records" TItem="typeof(data.records[0])" AllowFiltering="@data.allowFiltering" AllowPaging="@data.allowPaging" AllowSorting="@data.allowSorting">       
    <Columns>
        @foreach (var colDef in data.columnDefinitions)
        {
            <RadzenDataGridColumn TItem="typeof(data.records[0])" Property="@colDef.columnProperty" Title="@colDef.columnTitle"  />
        }            
    </Columns>           
</RadzenDataGrid>

Solution

  • You may want to try dynamic component in dotnet 6:

    <DynamicComponent Type="@componentType" Parameters="@parameters" />
    
    @code {
        private Type componentType = ...;
        private IDictionary<string, object> parameters = ...;
    }
    

    DOCS: https://learn.microsoft.com/en-us/aspnet/core/blazor/components/dynamiccomponent?view=aspnetcore-6.0

    Another option for other dotnet versions would be to try to define a render fragment directly in code (notice the line with ATTENTION comment):

    @page "/built-content"
    
    <h1>Build a component</h1>
    
    <div>
        @CustomRender
    </div>
    
    <button @onclick="RenderComponent">
        Create three Pet Details components
    </button>
    
    @code {
        private RenderFragment? CustomRender { get; set; }
    
        private RenderFragment CreateComponent() => builder =>
        {
            for (var i = 0; i < 3; i++) 
            {
                builder.OpenComponent(0, typeof(PetDetails));
                builder.AddAttribute(1, "PetDetailsQuote", "Someone's best friend!");
                builder.AddAttribute(2, "TItem", typeof(data.records[0])); // ATTENTION
                builder.CloseComponent();
            }
        };
    
        private void RenderComponent()
        {
            CustomRender = CreateComponent();
        }
    }
    

    DOCS: https://learn.microsoft.com/en-us/aspnet/core/blazor/advanced-scenarios?view=aspnetcore-3.1