@if (!Scopes.Any()) { } @foreach (var scope in Scopes) { @code { [Parameter] public IEnumerable Values { get; set; } [Parameter] public EventCallback> ValuesChanged { get; set; } List Scopes = new(); protected override void OnParametersSet() { var incoming = (Values ?? Enumerable.Empty()).ToList(); // Only rebuild local state when the incoming values actually differ. Without // this guard, the round-trip caused by our own ValuesChanged would clobber // in-progress edits on every re-render. if (!incoming.SequenceEqual(Scopes.Select(s => s.Name))) Scopes = incoming.Select(v => new ExternalProviderScope { Name = v }).ToList(); } async Task OnScopeChanged(ExternalProviderScope scope, string value) { scope.Name = value; await Update(); } async Task Add() { Scopes.Add(new ExternalProviderScope()); await Update(); } async Task Remove(ExternalProviderScope scope) { Scopes.Remove(scope); await Update(); } async Task Update() { if (ValuesChanged.HasDelegate) await ValuesChanged.InvokeAsync(Scopes.Select(s => s.Name).ToList()); } }