diff --git a/src/BootstrapBlazor/Components/Select/Select.razor.cs b/src/BootstrapBlazor/Components/Select/Select.razor.cs index 8156bc4ee2e..5f04d51841c 100644 --- a/src/BootstrapBlazor/Components/Select/Select.razor.cs +++ b/src/BootstrapBlazor/Components/Select/Select.razor.cs @@ -26,6 +26,12 @@ public partial class Select : ISelect, ILookup [NotNull] private ILookupService? InjectLookupService { get; set; } + /// + /// Gets or sets a value indicating whether the "active" state should be used when the associated value is null. + /// + [Parameter] + public bool IsUseActiveWhenValueIsNull { get; set; } + /// /// Gets or sets the display template. Default is null. /// @@ -444,10 +450,18 @@ private async Task OnChange(ChangeEventArgs args) { _lastSelectedValueString = ""; _init = false; - return null; + + return IsUseActiveWhenValueIsNull && !IsVirtualize + ? SetSelectedItemState(GetItemByRows()) + : null; } var item = IsVirtualize ? GetItemByVirtualized() : GetItemByRows(); + return SetSelectedItemState(item); + } + + private SelectedItem? SetSelectedItemState(SelectedItem? item) + { if (item != null) { if (_init && DisableItemChangedWhenFirstRender) diff --git a/test/UnitTest/Components/SelectTest.cs b/test/UnitTest/Components/SelectTest.cs index a3c1c9fe164..5a1cdb0babd 100644 --- a/test/UnitTest/Components/SelectTest.cs +++ b/test/UnitTest/Components/SelectTest.cs @@ -12,6 +12,38 @@ namespace UnitTest.Components; public class SelectTest : BootstrapBlazorTestBase { + [Fact] + public async Task IsUseActiveWhenValueNull_Ok() + { + var tcs = new TaskCompletionSource(); + var selectedValue = ""; + var cut = Context.RenderComponent(pb => + { + pb.AddChildContent>(pb => + { + pb.Add(a => a.ShowSearch, true); + pb.Add(a => a.Items, new List() + { + new("1", "Test1"), + new("2", "Test2") { Active = true } + }); + pb.Add(a => a.IsUseActiveWhenValueIsNull, true); + pb.Add(a => a.OnSelectedItemChanged, item => + { + selectedValue = item.Value; + tcs.SetResult(); + return Task.CompletedTask; + }); + }); + }); + + await tcs.Task; + + // 组件未设置 Value 参数,应该使用 Test2 作为初始选项,并且触发 SelectedItemChanged 回调 + Assert.Equal("2", selectedValue); + cut.Contains("value=\"Test2\""); + } + [Fact] public async Task OnSearchTextChanged_Null() {