Search code examples
c#asp.net-coreblazor

Error in Define Blazor Component Parameter


[Parameter]
public object Selected
{
    get => BindObject;
    set
    {
        if (BindObject == value)
            return;
        BindObject = value;
        SelectedChanged.InvokeAsync(BindObject);
        
    }
}

[Parameter]
public EventCallback<object> SelectedChanged { get; set; }

In use:

<MyComponent @bind-Selected="person" />

Error CS1503
Argument 2: cannot convert from 'Microsoft.AspNetCore.Components.EventCallback<CustomBlazorComponents.Components.Pages.Home.Person>' to 'Microsoft.AspNetCore.Components.EventCallback'

How do I have an EventCallback (for two-way binding) of type object?


Solution

  • You intent is not obvious, but it's unlikely the best way to approach your problem is with an object.

    Here's a refactored version of your code that demonstrates how to use generics in a component. I've used input for demo purposes to show how the bind works.

    MyComponent

    @typeparam TType
    <h3>MyComponent</h3>
    
    <input @bind:get="Selected" @bind:set="OnSet"/>
    
    @code {
        [Parameter] public TType? Selected { get; set; }
        [Parameter] public EventCallback<TType?> SelectedChanged { get; set; }
    
        private async Task OnSet(TType? value)
        {
            await this.SelectedChanged.InvokeAsync(value);
        }
    }
    

    Home

    @page "/"
    
    <PageTitle>Home</PageTitle>
    
    <h1>Hello, world!</h1>
    
    <MyComponent @bind-Selected="_value" />
    
    <div class="bg-dark text-white m-2 p-2">
        <pre>@_value</pre>
    </div>
    
    @code{
        private string _value = "Fred";
    }