Skip to content

Commit fc34c3c

Browse files
authored
doc(TreeView): add auto expand after drag sample code (dotnetcore#6471)
* refactor: 更新示例 * feat: 增加节点回调方法 可设置展开复选等功能 * doc: 更新拖动到子节点时父节点自动展开功能 * refactor: 精简代码 * test: 更新单元测试
1 parent e0f10c0 commit fc34c3c

File tree

4 files changed

+31
-16
lines changed

4 files changed

+31
-16
lines changed

src/BootstrapBlazor.Server/Components/Samples/TreeViews.razor.cs

Lines changed: 16 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -3,8 +3,6 @@
33
// See the LICENSE file in the project root for more information.
44
// Maintainer: Argo Zhang([email protected]) Website: https://www.blazor.zone
55

6-
using DocumentFormat.OpenXml.Spreadsheet;
7-
86
namespace BootstrapBlazor.Server.Components.Samples;
97

108
/// <summary>
@@ -121,7 +119,20 @@ private Task OnDragItemEndAsync(TreeViewDragContext<TreeFoo> context)
121119
source.ParentId = context.IsChildren ? target.Id : target.ParentId;
122120
}
123121
}
124-
DraggableItems = TreeFoo.CascadingTree(items);
122+
123+
Action<TreeViewItem<TreeFoo>>? cb = null;
124+
if (context.IsChildren)
125+
{
126+
// 自动展开目标节点
127+
cb = item =>
128+
{
129+
if (item.Value.Id == context.Target.Value.Id)
130+
{
131+
item.IsExpand = true;
132+
}
133+
};
134+
}
135+
DraggableItems = TreeFoo.CascadingTree(items, cb);
125136
DraggableItems[0].IsExpand = true;
126137
if (DraggableItems.Count > 1)
127138
{
@@ -184,9 +195,9 @@ private static List<TreeFoo> GetDraggableItems()
184195
new() { Text = "Item D", Id = "4", ParentId = "1", Icon = "fa-solid fa-font-awesome" },
185196
new() { Text = "Item E", Id = "5", ParentId = "1", Icon = "fa-solid fa-font-awesome" },
186197

187-
new() { Text = "Item B (Drop inside blocked)", Id = "2", Icon = "fa-solid fa-font-awesome" },
198+
new() { Text = "Item B", Id = "2", Icon = "fa-solid fa-font-awesome" },
188199
new() { Text = "Item F", Id = "6", ParentId = "2", Icon = "fa-solid fa-font-awesome" },
189-
new() { Text = "Item G (Can not move out)", Id = "9", ParentId = "2", Icon = "fa-solid fa-font-awesome" },
200+
new() { Text = "Item G", Id = "9", ParentId = "2", Icon = "fa-solid fa-font-awesome" },
190201

191202
new() { Text = "Item C", Id = "3", Icon = "fa-solid fa-font-awesome" },
192203
new() { Text = "Item H", Id = "7", ParentId = "3", Icon = "fa-solid fa-font-awesome" },

src/BootstrapBlazor.Server/Data/TreeFoo.cs

Lines changed: 3 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -177,10 +177,11 @@ public static List<TreeViewItem<TreeFoo>> GetCheckedTreeItems(string? parentId =
177177
/// 树状数据层次化方法
178178
/// </summary>
179179
/// <param name="items">数据集合</param>
180-
public static List<TreeViewItem<TreeFoo>> CascadingTree(IEnumerable<TreeFoo> items) => items.CascadingTree(null, (foo, parent) => foo.ParentId == parent?.Value.Id, foo => new TreeViewItem<TreeFoo>(foo)
180+
/// <param name="treeviewItemCallback">节点状态回调方法</param>
181+
public static List<TreeViewItem<TreeFoo>> CascadingTree(IEnumerable<TreeFoo> items, Action<TreeViewItem<TreeFoo>>? treeviewItemCallback = null) => items.CascadingTree(null, (foo, parent) => foo.ParentId == parent?.Value.Id, foo => new TreeViewItem<TreeFoo>(foo)
181182
{
182183
Text = foo.Text,
183184
Icon = foo.Icon,
184185
IsActive = foo.IsActive
185-
});
186+
}, treeviewItemCallback);
186187
}

src/BootstrapBlazor/Extensions/ExpandableNodeExtensions.cs

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -152,13 +152,16 @@ public static void SetParentExpand<TNode, TItem>(this TNode node, bool expand) w
152152
/// <param name="parent">父级节点</param>
153153
/// <param name="predicate">查找子节点 Lambda 表达式</param>
154154
/// <param name="valueFactory"></param>
155-
public static List<TreeViewItem<TItem>> CascadingTree<TItem>(this IEnumerable<TItem> items, TreeViewItem<TItem>? parent, Func<TItem, TreeViewItem<TItem>?, bool> predicate, Func<TItem, TreeViewItem<TItem>> valueFactory) => items
156-
.Where(i => predicate(i, parent))
157-
.Select(i =>
155+
/// <param name="treeViewItemCallback">节点是否展开回调方法 默认 null 未设置</param>
156+
public static List<TreeViewItem<TItem>> CascadingTree<TItem>(this IEnumerable<TItem> items, TreeViewItem<TItem>? parent, Func<TItem, TreeViewItem<TItem>?, bool> predicate, Func<TItem, TreeViewItem<TItem>> valueFactory, Action<TreeViewItem<TItem>>? treeViewItemCallback = null) => [.. items.Where(i => predicate(i, parent)).Select(i =>
157+
{
158+
var item = valueFactory(i);
159+
item.Items = items.CascadingTree(item, predicate, valueFactory, treeViewItemCallback);
160+
item.Parent = parent;
161+
if (treeViewItemCallback != null)
158162
{
159-
var item = valueFactory(i);
160-
item.Items = items.CascadingTree(item, predicate, valueFactory);
161-
item.Parent = parent;
162-
return item;
163-
}).ToList();
163+
treeViewItemCallback(item);
164+
}
165+
return item;
166+
})];
164167
}

test/UnitTest/Components/TreeViewTest.cs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -742,7 +742,7 @@ public void CascadeSetCheck_Ok()
742742
new() { Text = "Test3", Id = "03", ParentId = "02" }
743743
};
744744

745-
var node = TreeFoo.CascadingTree(items).First();
745+
var node = TreeFoo.CascadingTree(items, i => i.IsExpand = true).First();
746746

747747
// 设置当前几点所有子项选中状态
748748
var cache = new TreeNodeCache<TreeViewItem<TreeFoo>, TreeFoo>(comparer);

0 commit comments

Comments
 (0)