@@ -12,6 +12,7 @@ namespace BootstrapBlazor.Components;
12
12
/// Select 组件实现类
13
13
/// </summary>
14
14
/// <typeparam name="TValue"></typeparam>
15
+ [ ExcludeFromCodeCoverage ]
15
16
public partial class Select < TValue > : ISelect , IModelEqualityComparer < TValue >
16
17
{
17
18
[ Inject ]
@@ -50,7 +51,7 @@ public partial class Select<TValue> : ISelect, IModelEqualityComparer<TValue>
50
51
/// <param name="item"></param>
51
52
/// <returns></returns>
52
53
private string ? ActiveItem ( SelectedItem item ) => CssBuilder . Default ( "dropdown-item" )
53
- . AddClass ( "active" , Match ( item ) )
54
+ . AddClass ( "active" , item . Value == CurrentValueAsString )
54
55
. AddClass ( "disabled" , item . IsDisabled )
55
56
. Build ( ) ;
56
57
@@ -191,6 +192,55 @@ public partial class Select<TValue> : ISelect, IModelEqualityComparer<TValue>
191
192
[ NotNull ]
192
193
private Virtualize < SelectedItem > ? VirtualizeElement { get ; set ; }
193
194
195
+ /// <summary>
196
+ /// 获得/设置 绑定数据集
197
+ /// </summary>
198
+ [ Parameter ]
199
+ [ NotNull ]
200
+ public IEnumerable < SelectedItem > ? Items { get ; set ; }
201
+
202
+ /// <summary>
203
+ /// 获得/设置 选项模板
204
+ /// </summary>
205
+ [ Parameter ]
206
+ public RenderFragment < SelectedItem > ? ItemTemplate { get ; set ; }
207
+
208
+ /// <summary>
209
+ /// 获得/设置 下拉框项目改变前回调委托方法 返回 true 时选项值改变,否则选项值不变
210
+ /// </summary>
211
+ [ Parameter ]
212
+ public Func < SelectedItem , Task < bool > > ? OnBeforeSelectedItemChange { get ; set ; }
213
+
214
+ /// <summary>
215
+ /// SelectedItemChanged 回调方法
216
+ /// </summary>
217
+ [ Parameter ]
218
+ public Func < SelectedItem , Task > ? OnSelectedItemChanged { get ; set ; }
219
+
220
+ /// <summary>
221
+ /// 获得/设置 Swal 图标 默认 Question
222
+ /// </summary>
223
+ [ Parameter ]
224
+ public SwalCategory SwalCategory { get ; set ; } = SwalCategory . Question ;
225
+
226
+ /// <summary>
227
+ /// 获得/设置 Swal 标题 默认 null
228
+ /// </summary>
229
+ [ Parameter ]
230
+ public string ? SwalTitle { get ; set ; }
231
+
232
+ /// <summary>
233
+ /// 获得/设置 Swal 内容 默认 null
234
+ /// </summary>
235
+ [ Parameter ]
236
+ public string ? SwalContent { get ; set ; }
237
+
238
+ /// <summary>
239
+ /// 获得/设置 Footer 默认 null
240
+ /// </summary>
241
+ [ Parameter ]
242
+ public string ? SwalFooter { get ; set ; }
243
+
194
244
[ Inject ]
195
245
[ NotNull ]
196
246
private IStringLocalizer < Select < TValue > > ? Localizer { get ; set ; }
@@ -214,6 +264,11 @@ public partial class Select<TValue> : ISelect, IModelEqualityComparer<TValue>
214
264
215
265
private ItemsProviderResult < SelectedItem > _result ;
216
266
267
+ /// <summary>
268
+ /// 当前选择项实例
269
+ /// </summary>
270
+ private SelectedItem ? SelectedItem { get ; set ; }
271
+
217
272
private List < SelectedItem > Rows
218
273
{
219
274
get
@@ -234,7 +289,7 @@ private SelectedItem? SelectedRow
234
289
235
290
private SelectedItem ? GetSelectedRow ( )
236
291
{
237
- var item = Rows . Find ( Match )
292
+ var item = Rows . Find ( i => i . Value == CurrentValueAsString )
238
293
?? Rows . Find ( i => i . Active )
239
294
?? Rows . Where ( i => ! i . IsDisabled ) . FirstOrDefault ( )
240
295
?? GetVirtualizeItem ( ) ;
@@ -374,8 +429,6 @@ private bool TryParseSelectItem(string value, [MaybeNullWhen(false)] out TValue
374
429
/// <returns></returns>
375
430
protected override Task InvokeInitAsync ( ) => InvokeVoidAsync ( "init" , Id , Interop , nameof ( ConfirmSelectedItem ) ) ;
376
431
377
- private bool Match ( SelectedItem i ) => i is SelectedItem < TValue > d ? Equals ( d . Value , Value ) : i . Value . Equals ( CurrentValueAsString , StringComparison ) ;
378
-
379
432
/// <summary>
380
433
/// 客户端回车回调方法
381
434
/// </summary>
@@ -453,13 +506,13 @@ private async Task ValueTypeChanged(SelectedItem item)
453
506
{
454
507
if ( _lastSelectedValueString != item . Value )
455
508
{
456
- _lastSelectedValueString = item . Value ;
457
509
458
510
item . Active = true ;
459
511
SelectedItem = item ;
460
512
461
513
// 触发 StateHasChanged
462
- CurrentValueAsString = item . Value ;
514
+ _lastSelectedValueString = item . Value ?? "" ;
515
+ CurrentValueAsString = _lastSelectedValueString ;
463
516
464
517
// 触发 SelectedItemChanged 事件
465
518
if ( OnSelectedItemChanged != null )
@@ -518,41 +571,13 @@ private async Task OnChange(ChangeEventArgs args)
518
571
519
572
if ( item == null )
520
573
{
521
- // 判断是否为泛型 SelectedItem
522
- var itemType = Items . GetType ( ) ;
523
- var isGeneric = false ;
524
- if ( itemType . IsGenericType )
525
- {
526
- isGeneric = itemType . GetGenericArguments ( ) [ 0 ] . IsGenericType ;
527
- }
528
- if ( isGeneric )
529
- {
530
- TValue ? val = default ;
531
- if ( TextConvertToValueCallback != null )
532
- {
533
- val = await TextConvertToValueCallback ( v ) ;
534
- }
535
- item = new SelectedItem < TValue > ( ) { Text = v , Value = val } ;
536
- }
537
- else
538
- {
539
- item = new SelectedItem ( v , v ) ;
540
- }
574
+ item = new SelectedItem ( v , v ) ;
541
575
542
576
var items = new List < SelectedItem > ( ) { item } ;
543
577
items . AddRange ( Items ) ;
544
578
Items = items ;
545
- CurrentValueAsString = v ;
546
- }
547
-
548
- if ( item is SelectedItem < TValue > value )
549
- {
550
- CurrentValue = value . Value ;
551
- }
552
- else
553
- {
554
- CurrentValueAsString = v ;
555
579
}
580
+ CurrentValueAsString = v ;
556
581
557
582
if ( OnInputChangedCallback != null )
558
583
{
0 commit comments