CustomValidator

You must use @bind-Value in order for validation to work (or find a way to set ValueExpression). Setting Value and ValueChanged will not initialize ValueExpression as opposed to @bindValue. And ValueExpression is what Blazor uses to validate.

Also here is the relevant code from Blazor itself: aspnetcore/src/Components/Web/src/Forms/InputBase.cs at main · dotnet/aspnetcore · GitHub

UPDATE: Found a relevant thread in StackOverflow:

<div>
    <p>My custom input wrapper</p>
    @* If you pass @bind-Value it won't work*@
    @* You need to pass the properties that are used in the bind*@
    <RadzenTextBox Value="@Value" ValueChanged="@ValueChanged" ValueExpression="@ValueExpression" />
</div>

@code {    
    [Parameter]
    public virtual string Value { get; set; }

    [Parameter]
    public EventCallback<string> ValueChanged { get; set; }

    [Parameter]
    public Expression<Func<string>> ValueExpression { get; set; }        
}