diff --git a/src/BootstrapBlazor/Components/Select/Select.razor.cs b/src/BootstrapBlazor/Components/Select/Select.razor.cs index 5786295d175..07b418f8785 100644 --- a/src/BootstrapBlazor/Components/Select/Select.razor.cs +++ b/src/BootstrapBlazor/Components/Select/Select.razor.cs @@ -118,6 +118,12 @@ public partial class Select : ISelect, ILookup [Parameter] public object? LookupServiceData { get; set; } + /// + /// Gets or sets the default text for virtualized items. Default is null. + /// + [Parameter] + public string? DefaultVirtualizeItemText { get; set; } + /// /// /// @@ -169,17 +175,7 @@ private SelectedItem? SelectedRow return null; } - if (IsVirtualize) - { - _init = false; - return new SelectedItem(CurrentValueAsString, CurrentValueAsString); - } - - var item = GetItemWithEnumValue() - ?? Rows.Find(i => i.Value == CurrentValueAsString) - ?? Rows.Find(i => i.Active) - ?? Rows.FirstOrDefault(i => !i.IsDisabled); - + var item = IsVirtualize ? GetItemByVirtulized() : GetItemByRows(); if (item != null) { if (_init && DisableItemChangedWhenFirstRender) @@ -195,9 +191,18 @@ private SelectedItem? SelectedRow return item; } - private SelectedItem? GetItemWithEnumValue() => ValueType.IsEnum - ? Rows.Find(i => i.Value == Convert.ToInt32(Value).ToString()) - : null; + private SelectedItem? GetItemWithEnumValue() => ValueType.IsEnum ? Rows.Find(i => i.Value == Convert.ToInt32(Value).ToString()) : null; + + private SelectedItem GetItemByVirtulized() => new(CurrentValueAsString, DefaultVirtualizeItemText ?? CurrentValueAsString); + + private SelectedItem? GetItemByRows() + { + var item = GetItemWithEnumValue() + ?? Rows.Find(i => i.Value == CurrentValueAsString) + ?? Rows.Find(i => i.Active) + ?? Rows.FirstOrDefault(i => !i.IsDisabled); + return item; + } /// /// diff --git a/src/BootstrapBlazor/Components/Select/SelectBase.cs b/src/BootstrapBlazor/Components/Select/SelectBase.cs index efacfbd4cf6..8e7b0862f32 100644 --- a/src/BootstrapBlazor/Components/Select/SelectBase.cs +++ b/src/BootstrapBlazor/Components/Select/SelectBase.cs @@ -111,14 +111,6 @@ public abstract class SelectBase : PopoverSelectBase [Parameter] public int OverscanCount { get; set; } = 4; - /// - /// Gets or sets the default text for virtualized items. Default is null. - /// - [Parameter] - [ExcludeFromCodeCoverage] - [Obsolete("已弃用,删除即可;Deprecated, just delete")] - public string? DefaultVirtualizeItemText { get; set; } - /// /// Gets or sets the callback method when the clear button is clicked. Default is null. /// diff --git a/test/UnitTest/Components/SelectTest.cs b/test/UnitTest/Components/SelectTest.cs index c3956644435..9e0fa240e2a 100644 --- a/test/UnitTest/Components/SelectTest.cs +++ b/test/UnitTest/Components/SelectTest.cs @@ -371,7 +371,7 @@ await cut.InvokeAsync(() => } [Fact] - public void DisableItemChangedWhenFirstRender_Ok() + public void DisableItemChangedWhenFirstRender_False() { var triggered = false; @@ -394,6 +394,30 @@ public void DisableItemChangedWhenFirstRender_Ok() Assert.False(triggered); } + [Fact] + public void DisableItemChangedWhenFirstRender_True() + { + var triggered = false; + + // 空值时,不触发 OnSelectedItemChanged 回调 + var cut = Context.RenderComponent>(pb => + { + pb.Add(a => a.Items, new SelectedItem[] + { + new("1", "Test"), + new("2", "Test2") + }); + pb.Add(a => a.Value, ""); + pb.Add(a => a.OnSelectedItemChanged, item => + { + triggered = true; + return Task.CompletedTask; + }); + pb.Add(a => a.DisableItemChangedWhenFirstRender, false); + }); + Assert.True(triggered); + } + [Fact] public void Color_Ok() { @@ -736,6 +760,30 @@ public void ItemClick_Ok() }); } + [Fact] + public void DefaultVirtualizeItemText_Ok() + { + var cut = Context.RenderComponent>(pb => + { + pb.Add(a => a.Items, new SelectedItem[] + { + new("1", "Test1"), + new("2", "Test2") + }); + pb.Add(a => a.Value, "3"); + pb.Add(a => a.IsVirtualize, true); + }); + + var input = cut.Find(".form-select"); + Assert.Contains("value=\"3\"", input.OuterHtml); + + cut.SetParametersAndRender(pb => + { + pb.Add(a => a.DefaultVirtualizeItemText, "Test3"); + }); + Assert.Contains("value=\"Test3\"", input.OuterHtml); + } + [Fact] public void IsVirtualize_Items() { diff --git a/test/UnitTest/Components/TreeViewTest.cs b/test/UnitTest/Components/TreeViewTest.cs index 13b1d6a249a..36f9c70bfe3 100644 --- a/test/UnitTest/Components/TreeViewTest.cs +++ b/test/UnitTest/Components/TreeViewTest.cs @@ -596,6 +596,7 @@ public async Task IsVirtualize_Ok() { pb.Add(a => a.IsVirtualize, true); pb.Add(a => a.RowHeight, 30f); + pb.Add(a => a.OverscanCount, 4); pb.Add(a => a.OnExpandNodeAsync, async item => { await Task.Delay(10);