diff --git a/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs b/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs index 265cc73d77c..4aa2498443a 100644 --- a/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs +++ b/src/BootstrapBlazor/Components/TreeView/TreeView.razor.cs @@ -324,6 +324,13 @@ public partial class TreeView : IModelEqualityComparer [Parameter] public bool AutoCheckParent { get; set; } + /// + /// 获得/设置 方法返回的集合是否包含半选节点,默认为 false + /// Gets or sets whether the collection returned by includes indeterminate nodes. Default is false + /// + [Parameter] + public bool IsIncludeIndeterminateWhenGetCheckedItems { get; set; } + /// /// 获得/设置 是否允许拖放操作,默认为 false /// Gets or sets a value indicating whether drag-and-drop operations are allowed. Default is false @@ -955,7 +962,10 @@ public IEnumerable> GetCheckedItems() => Items.Aggregate(new t.Add(item); t.AddRange(item.GetAllSubItems().OfType>()); return t; - }).Where(i => i.CheckedState == CheckboxState.Checked); + }).Where(GetCheckedItems); + + + private bool GetCheckedItems(TreeViewItem item) => IsIncludeIndeterminateWhenGetCheckedItems ? item.CheckedState != CheckboxState.UnChecked : item.CheckedState == CheckboxState.Checked; /// /// 检查数据是否相同 diff --git a/test/UnitTest/Components/TreeViewTest.cs b/test/UnitTest/Components/TreeViewTest.cs index 52b634a04b0..f91c3d5b5f7 100644 --- a/test/UnitTest/Components/TreeViewTest.cs +++ b/test/UnitTest/Components/TreeViewTest.cs @@ -333,6 +333,35 @@ public async Task AutoCheckParent_TriState_Ok() Assert.Equal(CheckboxState.UnChecked, checkboxes[0].Instance.Value.CheckedState); } + [Fact] + public void GetCheckedItems_IncludeIndeterminate_Ok() + { + var items = new List + { + new() { Text = "Node1", Id = "1010" }, + new() { Text = "Node11", Id = "1011", ParentId = "1010" }, + new() { Text = "Node12", Id = "1012", ParentId = "1010" } + }; + + var nodes = TreeFoo.CascadingTree(items); + nodes[0].Items[0].CheckedState = CheckboxState.Checked; + + var cut = Context.Render>(pb => + { + pb.Add(a => a.AutoCheckParent, true); + pb.Add(a => a.Items, nodes); + pb.Add(a => a.ShowCheckbox, true); + }); + + Assert.Equal(CheckboxState.Indeterminate, nodes[0].CheckedState); + Assert.False(cut.Instance.IsIncludeIndeterminateWhenGetCheckedItems); + Assert.Equal([nodes[0].Items[0]], cut.Instance.GetCheckedItems()); + + cut.Render(pb => pb.Add(a => a.IsIncludeIndeterminateWhenGetCheckedItems, true)); + + Assert.Equal([nodes[0], nodes[0].Items[0]], cut.Instance.GetCheckedItems()); + } + [Fact] public async Task AutoCheckParent_ToggleNode_Ok() {