@@ -11,9 +11,7 @@ namespace BootstrapBlazor.Components;
11
11
/// <summary>
12
12
/// Tree 组件
13
13
/// </summary>
14
- #if NET6_0_OR_GREATER
15
14
[ CascadingTypeParameter ( nameof ( TItem ) ) ]
16
- #endif
17
15
public partial class TreeView < TItem > : IModelEqualityComparer < TItem >
18
16
{
19
17
/// <summary>
@@ -58,7 +56,7 @@ public partial class TreeView<TItem> : IModelEqualityComparer<TItem>
58
56
. Build ( ) ;
59
57
60
58
private string ? GetContentClassString ( TreeViewItem < TItem > item ) => CssBuilder . Default ( "tree-content" )
61
- . AddClass ( "active" , ActiveItem == item )
59
+ . AddClass ( "active" , _activeItem == item )
62
60
. Build ( ) ;
63
61
64
62
private string ? GetNodeClassString ( TreeViewItem < TItem > item ) => CssBuilder . Default ( "tree-node" )
@@ -74,7 +72,7 @@ public partial class TreeView<TItem> : IModelEqualityComparer<TItem>
74
72
/// <summary>
75
73
/// 获得/设置 选中节点 默认 null
76
74
/// </summary>
77
- private TreeViewItem < TItem > ? ActiveItem { get ; set ; }
75
+ private TreeViewItem < TItem > ? _activeItem ;
78
76
79
77
/// <summary>
80
78
/// 获得/设置 是否禁用整个组件 默认 false
@@ -168,11 +166,11 @@ public partial class TreeView<TItem> : IModelEqualityComparer<TItem>
168
166
[ NotNull ]
169
167
public List < TreeViewItem < TItem > > ? Items { get ; set ; }
170
168
171
- /// <summary>
172
- /// 获得/设置 扁平化数据集合注意 <see cref="TreeViewItem{TItem}.Parent"/> 参数一定要赋值,不然无法呈现层次结构
173
- /// </summary>
174
- [ Parameter ]
175
- public List < TreeViewItem < TItem > > ? FlatItems { get ; set ; }
169
+ ///// <summary>
170
+ ///// 获得/设置 扁平化数据集合注意 <see cref="TreeViewItem{TItem}.Parent"/> 参数一定要赋值,不然无法呈现层次结构
171
+ ///// </summary>
172
+ // [Parameter]
173
+ // public List<TreeViewItem<TItem>>? FlatItems { get; set; }
176
174
177
175
/// <summary>
178
176
/// 获得/设置 是否显示 CheckBox 默认 false 不显示
@@ -347,6 +345,11 @@ protected override void OnParametersSet()
347
345
SearchIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TreeViewSearchIcon ) ;
348
346
ClearSearchIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TreeViewResetSearchIcon ) ;
349
347
LoadingIcon ??= IconTheme . GetIconByKey ( ComponentIcons . TreeViewLoadingIcon ) ;
348
+
349
+ if ( IsReset )
350
+ {
351
+ _rows = null ;
352
+ }
350
353
}
351
354
352
355
/// <summary>
@@ -355,8 +358,12 @@ protected override void OnParametersSet()
355
358
/// <returns></returns>
356
359
protected override async Task OnParametersSetAsync ( )
357
360
{
358
- _rows = null ;
359
- Items ??= [ ] ;
361
+ if ( Items == null )
362
+ {
363
+ // 未提供数据显示 loading
364
+ return ;
365
+ }
366
+
360
367
if ( Items . Count > 0 )
361
368
{
362
369
await CheckExpand ( Items ) ;
@@ -369,16 +376,16 @@ protected override async Task OnParametersSetAsync()
369
376
}
370
377
371
378
// 从数据源中恢复当前 active 节点
372
- if ( ActiveItem != null )
379
+ if ( _activeItem != null )
373
380
{
374
- ActiveItem = TreeNodeStateCache . Find ( Items , ActiveItem . Value , out _ ) ;
381
+ _activeItem = TreeNodeStateCache . Find ( Items , _activeItem . Value , out _ ) ;
375
382
}
376
383
377
384
if ( _init == false )
378
385
{
379
386
// 设置 ActiveItem 默认值
380
- ActiveItem ??= Items . FirstOrDefaultActiveItem ( ) ;
381
- ActiveItem ? . SetParentExpand < TreeViewItem < TItem > , TItem > ( true ) ;
387
+ _activeItem ??= Items . FirstOrDefaultActiveItem ( ) ;
388
+ _activeItem ? . SetParentExpand < TreeViewItem < TItem > , TItem > ( true ) ;
382
389
_init = true ;
383
390
}
384
391
}
@@ -417,16 +424,16 @@ public async ValueTask TriggerKeyDown(string key)
417
424
{
418
425
// 通过 ActiveItem 找到兄弟节点
419
426
// 如果兄弟节点没有时,找到父亲节点
420
- if ( ActiveItem != null )
427
+ if ( _activeItem != null )
421
428
{
422
429
if ( key == "ArrowUp" || key == "ArrowDown" )
423
430
{
424
431
_keyboardArrowUpDownTrigger = true ;
425
- await ActiveTreeViewItem ( key , ActiveItem ) ;
432
+ await ActiveTreeViewItem ( key , _activeItem ) ;
426
433
}
427
434
else if ( key == "ArrowLeft" || key == "ArrowRight" )
428
435
{
429
- await OnToggleNodeAsync ( ActiveItem , true ) ;
436
+ await OnToggleNodeAsync ( _activeItem , true ) ;
430
437
}
431
438
}
432
439
}
@@ -574,7 +581,7 @@ private async Task<IEnumerable<IExpandableNode<TItem>>> GetChildrenRowAsync(Tree
574
581
/// <returns></returns>
575
582
private async Task OnClick ( TreeViewItem < TItem > item )
576
583
{
577
- ActiveItem = item ;
584
+ _activeItem = item ;
578
585
if ( ClickToggleNode && CanTriggerClickNode ( item ) )
579
586
{
580
587
await OnToggleNodeAsync ( item ) ;
@@ -622,21 +629,43 @@ private async Task OnClickResetSearch()
622
629
/// <summary>
623
630
/// 设置选中节点
624
631
/// </summary>
625
- public void SetActiveItem ( TreeViewItem < TItem > item )
632
+ public void SetActiveItem ( TreeViewItem < TItem > ? item )
633
+ {
634
+ _activeItem = item ;
635
+ _activeItem ? . SetParentExpand < TreeViewItem < TItem > , TItem > ( true ) ;
636
+ StateHasChanged ( ) ;
637
+ }
638
+
639
+ /// <summary>
640
+ /// 重新设置 <see cref="Items"/> 数据源方法
641
+ /// </summary>
642
+ public void SetItems ( List < TreeViewItem < TItem > > items )
626
643
{
627
- ActiveItem = item ;
628
- ActiveItem . SetParentExpand < TreeViewItem < TItem > , TItem > ( true ) ;
644
+ //FlatItems = null;
645
+ Items = items ;
646
+ _rows = null ;
629
647
StateHasChanged ( ) ;
630
648
}
631
649
650
+ ///// <summary>
651
+ ///// 重新设置 <see cref="FlatItems"/> 数据源方法
652
+ ///// </summary>
653
+ ///// <param name="flatItems"></param>
654
+ //public void SetFlatItems(List<TreeViewItem<TItem>> flatItems)
655
+ //{
656
+ // Items = null;
657
+ // FlatItems = flatItems;
658
+ // _rows = null;
659
+ // StateHasChanged();
660
+ //}
661
+
632
662
/// <summary>
633
663
/// 设置选中节点
634
664
/// </summary>
635
665
public void SetActiveItem ( TItem item )
636
666
{
637
- ActiveItem = Items . GetAllItems ( ) . FirstOrDefault ( i => Equals ( i . Value , item ) ) ;
638
- ActiveItem ? . SetParentExpand < TreeViewItem < TItem > , TItem > ( true ) ;
639
- StateHasChanged ( ) ;
667
+ var val = Items . GetAllItems ( ) . FirstOrDefault ( i => Equals ( i . Value , item ) ) ;
668
+ SetActiveItem ( val ) ;
640
669
}
641
670
642
671
private static CheckboxState ToggleCheckState ( CheckboxState state ) => state switch
@@ -832,7 +861,8 @@ private List<TreeViewItem<TItem>> Rows
832
861
{
833
862
get
834
863
{
835
- _rows ??= FlatItems ?? Items . ToFlat < TItem > ( ) . ToList ( ) ;
864
+ // 扁平化数据集合
865
+ _rows ??= Items . ToFlat < TItem > ( ) . ToList ( ) ;
836
866
return _rows ;
837
867
}
838
868
}
0 commit comments