diff --git a/Radzen.Blazor/Common.cs b/Radzen.Blazor/Common.cs index a5d4841afa..c1156022fe 100644 --- a/Radzen.Blazor/Common.cs +++ b/Radzen.Blazor/Common.cs @@ -2639,6 +2639,51 @@ public class TreeItemSettings public RenderFragment Template { get; set; } } + /// + /// Supplies information about a item render event that is being raised. + /// + public class TreeItemRenderEventArgs + { + /// + /// Gets or sets the item HTML attributes. + /// + public IDictionary Attributes { get; private set; } = new Dictionary(); + + bool _checkedSet; + internal bool CheckedSet() + { + return _checkedSet; + } + + bool? _checked; + /// + /// Gets or sets a value indicating whether this item is checked. + /// + /// true if expanded; otherwise, false. + public bool? Checked + { + get + { + return _checked; + } + set + { + _checkedSet = true; + _checked = value; + } + } + + /// + /// Gets tree item. + /// + public object Value { get; internal set; } + + /// + /// Gets child items. + /// + public IEnumerable Data { get; internal set; } + } + /// /// Supplies information about a event that is being raised. /// diff --git a/Radzen.Blazor/RadzenTree.razor.cs b/Radzen.Blazor/RadzenTree.razor.cs index 84be23fa56..85880836b2 100644 --- a/Radzen.Blazor/RadzenTree.razor.cs +++ b/Radzen.Blazor/RadzenTree.razor.cs @@ -114,6 +114,24 @@ protected override string GetComponentCssClass() [Parameter] public EventCallback Collapse { get; set; } + /// + /// A callback that will be invoked when item is rendered. + /// + [Parameter] + public Action ItemRender { get; set; } + + internal Tuple> ItemAttributes(RadzenTreeItem item) + { + var args = new TreeItemRenderEventArgs() { Data = item.GetAllChildValues(), Value = item.Value }; + + if (ItemRender != null) + { + ItemRender(args); + } + + return new Tuple>(args, new System.Collections.ObjectModel.ReadOnlyDictionary(args.Attributes)); + } + /// /// Gets or sets the child content. /// diff --git a/Radzen.Blazor/RadzenTreeItem.razor b/Radzen.Blazor/RadzenTreeItem.razor index 3ab3d5e090..ba875afd76 100644 --- a/Radzen.Blazor/RadzenTreeItem.razor +++ b/Radzen.Blazor/RadzenTreeItem.razor @@ -1,7 +1,8 @@ @using Radzen @using Radzen.Blazor.Rendering @implements IDisposable -
  • +@{var itemArgs = Tree?.ItemAttributes(this); } +
  • @if (ChildContent != null || HasChildren) { @@ -9,7 +10,7 @@ } @if(Tree != null && Tree.AllowCheckBoxes) { - + } @if (Template != null) { diff --git a/Radzen.Blazor/RadzenTreeItem.razor.cs b/Radzen.Blazor/RadzenTreeItem.razor.cs index 9ab142dc79..a896499abc 100644 --- a/Radzen.Blazor/RadzenTreeItem.razor.cs +++ b/Radzen.Blazor/RadzenTreeItem.razor.cs @@ -361,7 +361,7 @@ IEnumerable GetCheckedValues() return Tree.CheckedValues != null ? Tree.CheckedValues : Enumerable.Empty(); } - IEnumerable GetAllChildValues(Func predicate = null) + internal IEnumerable GetAllChildValues(Func predicate = null) { var children = items.Concat(items.SelectManyRecursive(i => i.items)).Select(i => i.Value); diff --git a/RadzenBlazorDemos/Pages/TreeCheckBoxes.razor b/RadzenBlazorDemos/Pages/TreeCheckBoxes.razor index d59eaac8d5..f61bdc7efe 100644 --- a/RadzenBlazorDemos/Pages/TreeCheckBoxes.razor +++ b/RadzenBlazorDemos/Pages/TreeCheckBoxes.razor @@ -7,7 +7,8 @@
    - + false) /> @@ -57,5 +58,15 @@ await base.OnInitializedAsync(); categories = dbContext.Categories.Include(c => c.Products); + + checkedValues = dbContext.Products.Where(p => p.ProductName.StartsWith("C")); + } + + void TreeItemRender(TreeItemRenderEventArgs args) + { + if (args.Value == categories.FirstOrDefault() && !args.Data.Cast().Any()) + { + args.Checked = null; + } } } \ No newline at end of file