Skip to content
Merged
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
16 changes: 15 additions & 1 deletion src/BootstrapBlazor/Components/Select/Select.razor.cs
Original file line number Diff line number Diff line change
Expand Up @@ -26,6 +26,12 @@ public partial class Select<TValue> : ISelect, ILookup
[NotNull]
private ILookupService? InjectLookupService { get; set; }

/// <summary>
/// Gets or sets a value indicating whether the "active" state should be used when the associated value is null.
/// </summary>
[Parameter]
public bool IsUseActiveWhenValueIsNull { get; set; }

/// <summary>
/// Gets or sets the display template. Default is null.
/// </summary>
Expand Down Expand Up @@ -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)
Expand Down
32 changes: 32 additions & 0 deletions test/UnitTest/Components/SelectTest.cs
Original file line number Diff line number Diff line change
Expand Up @@ -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<BootstrapBlazorRoot>(pb =>
{
pb.AddChildContent<Select<string>>(pb =>
{
pb.Add(a => a.ShowSearch, true);
pb.Add(a => a.Items, new List<SelectedItem>()
{
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()
{
Expand Down