Skip to content

Commit 8b246b8

Browse files
authored
fix(Select): can not switch Value when data type is SelectedItem on Virtual mode (#4850)
* fix: 修复虚拟数据无法切换数据问题 * test: 更新单元测试 * refactor: 精简代码 * Revert "refactor: 精简代码" This reverts commit 114d3ad. * refactor: 重构代码 * test: 更新单元测试
1 parent c673833 commit 8b246b8

File tree

2 files changed

+20
-22
lines changed

2 files changed

+20
-22
lines changed

src/BootstrapBlazor/Components/Select/Select.razor.cs

+10-9
Original file line numberDiff line numberDiff line change
@@ -264,7 +264,7 @@ private SelectedItem? SelectedRow
264264
var item = Rows.Find(i => i.Value == CurrentValueAsString)
265265
?? Rows.Find(i => i.Active)
266266
?? Rows.Where(i => !i.IsDisabled).FirstOrDefault()
267-
?? GetVirtualizeItem();
267+
?? GetVirtualizeItem(CurrentValueAsString);
268268

269269
if (item != null)
270270
{
@@ -376,22 +376,23 @@ protected override bool TryParseValueFromString(string value, [MaybeNullWhen(fal
376376

377377
private bool TryParseSelectItem(string value, [MaybeNullWhen(false)] out TValue result, out string? validationErrorMessage)
378378
{
379-
SelectedItem = Items.FirstOrDefault(i => i.Value == value)
380-
?? GetVirtualizeItem();
379+
SelectedItem = Rows.FirstOrDefault(i => i.Value == value)
380+
?? GetVirtualizeItem(value);
381381

382382
// support SelectedItem? type
383383
result = SelectedItem != null ? (TValue)(object)SelectedItem : default;
384384
validationErrorMessage = "";
385385
return SelectedItem != null;
386386
}
387387

388-
private SelectedItem? GetVirtualizeItem()
388+
private SelectedItem? GetVirtualizeItem(string value)
389389
{
390-
return OnQueryAsync == null ? null : GetSelectedItem();
391-
392-
SelectedItem? GetSelectedItem() => ValueType == typeof(SelectedItem)
393-
? (SelectedItem)(object)Value
394-
: new SelectedItem(CurrentValueAsString, DefaultVirtualizeItemText ?? CurrentValueAsString);
390+
SelectedItem? item = null;
391+
if (_result.Items != null)
392+
{
393+
item = _result.Items.FirstOrDefault(i => i.Value == value) ?? new SelectedItem(value, DefaultVirtualizeItemText ?? value);
394+
}
395+
return item;
395396
}
396397

397398
/// <summary>

test/UnitTest/Components/SelectTest.cs

+10-13
Original file line numberDiff line numberDiff line change
@@ -747,7 +747,7 @@ public async Task IsVirtualize_OnQueryAsync_Clearable_Ok()
747747
}
748748

749749
[Fact]
750-
public void IsVirtualize_BindValue()
750+
public async Task IsVirtualize_BindValue()
751751
{
752752
var value = new SelectedItem("3", "Test 3");
753753
var cut = Context.RenderComponent<Select<SelectedItem>>(pb =>
@@ -772,24 +772,21 @@ public void IsVirtualize_BindValue()
772772
});
773773
});
774774

775-
cut.InvokeAsync(() =>
776-
{
777-
var input = cut.Find(".form-select");
778-
Assert.Equal("Test 3", input.GetAttribute("value"));
779-
});
780-
cut.Contains("Test 3");
775+
var input = cut.Find(".form-select");
776+
Assert.Null(input.GetAttribute("value"));
777+
781778
var select = cut.Instance;
782779
Assert.Equal("3", select.Value?.Value);
783780

784-
cut.InvokeAsync(() =>
781+
var item = cut.Find(".dropdown-item");
782+
await cut.InvokeAsync(() =>
785783
{
786-
var item = cut.Find(".dropdown-item");
787784
item.Click();
788-
Assert.Equal("1", value.Value);
789-
790-
var input = cut.Find(".form-select");
791-
Assert.Equal("Test1", input.GetAttribute("value"));
792785
});
786+
Assert.Equal("1", value.Value);
787+
788+
input = cut.Find(".form-select");
789+
Assert.Equal("Test1", input.GetAttribute("value"));
793790
}
794791

795792
[Fact]

0 commit comments

Comments
 (0)