@@ -60,8 +60,6 @@ public partial class Select<TValue> : ISelect, IModelEqualityComparer<TValue>
60
60
61
61
private readonly List < SelectedItem > _children = [ ] ;
62
62
63
- private readonly List < SelectedItem > _dataSource = [ ] ;
64
-
65
63
/// <summary>
66
64
/// 获得/设置 右侧清除图标 默认 fa-solid fa-angle-up
67
65
/// </summary>
@@ -73,7 +71,6 @@ public partial class Select<TValue> : ISelect, IModelEqualityComparer<TValue>
73
71
/// 获得/设置 搜索文本发生变化时回调此方法
74
72
/// </summary>
75
73
[ Parameter ]
76
- [ NotNull ]
77
74
public Func < string , IEnumerable < SelectedItem > > ? OnSearchTextChanged { get ; set ; }
78
75
79
76
/// <summary>
@@ -213,6 +210,68 @@ public partial class Select<TValue> : ISelect, IModelEqualityComparer<TValue>
213
210
214
211
private bool _init = true ;
215
212
213
+ private List < SelectedItem > ? _itemsCache ;
214
+
215
+ private ItemsProviderResult < SelectedItem > _result ;
216
+
217
+ private List < SelectedItem > Rows
218
+ {
219
+ get
220
+ {
221
+ _itemsCache ??= string . IsNullOrEmpty ( SearchText ) ? GetRowsByItems ( ) : GetRowsBySearch ( ) ;
222
+ return _itemsCache ;
223
+ }
224
+ }
225
+
226
+ private SelectedItem ? SelectedRow
227
+ {
228
+ get
229
+ {
230
+ SelectedItem ??= GetSelectedRow ( ) ;
231
+ return SelectedItem ;
232
+ }
233
+ }
234
+
235
+ private SelectedItem ? GetSelectedRow ( )
236
+ {
237
+ var item = Rows . Find ( Match )
238
+ ?? Rows . Find ( i => i . Active )
239
+ ?? Rows . Where ( i => ! i . IsDisabled ) . FirstOrDefault ( )
240
+ ?? GetVirtualizeItem ( ) ;
241
+
242
+ if ( item != null )
243
+ {
244
+ if ( _init && DisableItemChangedWhenFirstRender )
245
+ {
246
+
247
+ }
248
+ else
249
+ {
250
+ _ = SelectedItemChanged ( item ) ;
251
+ _init = false ;
252
+ }
253
+ }
254
+ return item ;
255
+ }
256
+
257
+ private List < SelectedItem > GetRowsByItems ( )
258
+ {
259
+ var items = new List < SelectedItem > ( ) ;
260
+ items . AddRange ( Items ) ;
261
+ items . AddRange ( _children ) ;
262
+ return items ;
263
+ }
264
+
265
+ private List < SelectedItem > GetRowsBySearch ( )
266
+ {
267
+ var items = OnSearchTextChanged ? . Invoke ( SearchText ) ?? FilterBySearchText ( GetRowsByItems ( ) ) ;
268
+ return items . ToList ( ) ;
269
+ }
270
+
271
+ private IEnumerable < SelectedItem > FilterBySearchText ( IEnumerable < SelectedItem > source ) => string . IsNullOrEmpty ( SearchText )
272
+ ? source
273
+ : source . Where ( i => i . Text . Contains ( SearchText , StringComparison ) ) ;
274
+
216
275
/// <summary>
217
276
/// <inheritdoc/>
218
277
/// </summary>
@@ -221,7 +280,6 @@ protected override void OnParametersSet()
221
280
base . OnParametersSet ( ) ;
222
281
223
282
Items ??= [ ] ;
224
- OnSearchTextChanged ??= text => Items . Where ( i => i . Text . Contains ( text , StringComparison ) ) ;
225
283
PlaceHolder ??= Localizer [ nameof ( PlaceHolder ) ] ;
226
284
NoSearchDataText ??= Localizer [ nameof ( NoSearchDataText ) ] ;
227
285
DropdownIcon ??= IconTheme . GetIconByKey ( ComponentIcons . SelectDropdownIcon ) ;
@@ -233,16 +291,17 @@ protected override void OnParametersSet()
233
291
var item = NullableUnderlyingType == null ? "" : PlaceHolder ;
234
292
Items = ValueType . ToSelectList ( string . IsNullOrEmpty ( item ) ? null : new SelectedItem ( "" , item ) ) ;
235
293
}
294
+
295
+ _itemsCache = null ;
296
+ SelectedItem = null ;
236
297
}
237
298
238
299
/// <summary>
239
300
/// 获得/设置 数据总条目
240
301
/// </summary>
241
302
private int TotalCount { get ; set ; }
242
303
243
- private IEnumerable < SelectedItem > ? VirtualItems { get ; set ; }
244
-
245
- private List < SelectedItem > GetVirtualItems ( ) => ( VirtualItems ?? Items ) . ToList ( ) ;
304
+ private List < SelectedItem > GetVirtualItems ( ) => FilterBySearchText ( GetRowsByItems ( ) ) . ToList ( ) ;
246
305
247
306
/// <summary>
248
307
/// 虚拟滚动数据加载回调方法
@@ -259,26 +318,23 @@ private async ValueTask<ItemsProviderResult<SelectedItem>> LoadItems(ItemsProvid
259
318
var data = await OnQueryAsync ( new ( ) { StartIndex = request . StartIndex , Count = count , SearchText = SearchText } ) ;
260
319
261
320
TotalCount = data . TotalCount ;
262
- VirtualItems = data . Items ?? [ ] ;
263
- return new ItemsProviderResult < SelectedItem > ( VirtualItems , TotalCount ) ;
321
+ var items = data . Items ?? [ ] ;
322
+ _result = new ItemsProviderResult < SelectedItem > ( items , TotalCount ) ;
323
+ return _result ;
264
324
265
325
int GetCountByTotal ( ) => TotalCount == 0 ? request . Count : Math . Min ( request . Count , TotalCount - request . StartIndex ) ;
266
326
}
267
327
268
328
private async Task SearchTextChanged ( string val )
269
329
{
270
330
SearchText = val ;
271
- if ( OnQueryAsync == null )
272
- {
273
- // 通过 Items 提供数据
274
- VirtualItems = OnSearchTextChanged ( SearchText ) ;
275
- }
276
- else
331
+ _itemsCache = null ;
332
+
333
+ if ( OnQueryAsync != null )
277
334
{
278
335
// 通过 ItemProvider 提供数据
279
336
await VirtualizeElement . RefreshDataAsync ( ) ;
280
337
}
281
- StateHasChanged ( ) ;
282
338
}
283
339
284
340
/// <summary>
@@ -295,7 +351,6 @@ protected override bool TryParseValueFromString(string value, [MaybeNullWhen(fal
295
351
private bool TryParseSelectItem ( string value , [ MaybeNullWhen ( false ) ] out TValue result , out string ? validationErrorMessage )
296
352
{
297
353
SelectedItem = Items . FirstOrDefault ( i => i . Value == value )
298
- ?? VirtualItems ? . FirstOrDefault ( i => i . Value == value )
299
354
?? GetVirtualizeItem ( ) ;
300
355
301
356
// support SelectedItem? type
@@ -313,51 +368,6 @@ private bool TryParseSelectItem(string value, [MaybeNullWhen(false)] out TValue
313
368
: new SelectedItem ( CurrentValueAsString , DefaultVirtualizeItemText ?? CurrentValueAsString ) ;
314
369
}
315
370
316
- private void ResetSelectedItem ( )
317
- {
318
- _dataSource . Clear ( ) ;
319
-
320
- if ( string . IsNullOrEmpty ( SearchText ) )
321
- {
322
- _dataSource . AddRange ( Items ) ;
323
- _dataSource . AddRange ( _children ) ;
324
-
325
- if ( VirtualItems != null )
326
- {
327
- _dataSource . AddRange ( VirtualItems ) ;
328
- }
329
-
330
- SelectedItem = _dataSource . Find ( Match )
331
- ?? _dataSource . Find ( i => i . Active )
332
- ?? _dataSource . Where ( i => ! i . IsDisabled ) . FirstOrDefault ( )
333
- ?? GetVirtualizeItem ( ) ;
334
-
335
- if ( SelectedItem != null )
336
- {
337
- if ( _init && DisableItemChangedWhenFirstRender )
338
- {
339
-
340
- }
341
- else
342
- {
343
- _ = SelectedItemChanged ( SelectedItem ) ;
344
- _init = false ;
345
- }
346
- }
347
- }
348
- else if ( IsVirtualize )
349
- {
350
- if ( Items . Any ( ) )
351
- {
352
- VirtualItems = OnSearchTextChanged ( SearchText ) ;
353
- }
354
- }
355
- else
356
- {
357
- _dataSource . AddRange ( OnSearchTextChanged ( SearchText ) ) ;
358
- }
359
- }
360
-
361
371
/// <summary>
362
372
/// <inheritdoc/>
363
373
/// </summary>
@@ -374,12 +384,11 @@ private void ResetSelectedItem()
374
384
[ JSInvokable ]
375
385
public async Task ConfirmSelectedItem ( int index )
376
386
{
377
- var ds = string . IsNullOrEmpty ( SearchText )
378
- ? _dataSource
379
- : OnSearchTextChanged ( SearchText ) ;
380
- var item = ds . ElementAt ( index ) ;
381
- await OnClickItem ( item ) ;
382
- StateHasChanged ( ) ;
387
+ if ( index < Rows . Count )
388
+ {
389
+ await OnClickItem ( Rows [ index ] ) ;
390
+ StateHasChanged ( ) ;
391
+ }
383
392
}
384
393
385
394
/// <summary>
@@ -483,24 +492,15 @@ private async Task OnClearValue()
483
492
}
484
493
485
494
SelectedItem ? item ;
486
- if ( IsVirtualize )
495
+ if ( OnQueryAsync != null )
487
496
{
488
- if ( VirtualizeElement != null )
489
- {
490
- await VirtualizeElement . RefreshDataAsync ( ) ;
491
- item = VirtualItems ! . FirstOrDefault ( ) ;
492
- }
493
- else
494
- {
495
- VirtualItems = Items ;
496
- item = Items . FirstOrDefault ( ) ;
497
- }
497
+ await VirtualizeElement . RefreshDataAsync ( ) ;
498
+ item = _result . Items . FirstOrDefault ( ) ;
498
499
}
499
500
else
500
501
{
501
502
item = Items . FirstOrDefault ( ) ;
502
503
}
503
-
504
504
if ( item != null )
505
505
{
506
506
await SelectedItemChanged ( item ) ;
0 commit comments