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; }
}