public void Execute(TreeNodeViewModel root, IList <TItem> items) { if (root == null) { throw new ArgumentNullException(nameof(root)); } if (items == null) { throw new ArgumentNullException(nameof(items)); } if (items.Count == 0) { return; } var groups = Group(root, items); if (Comparer != null) { groups = groups.OrderBy(cond => cond.Key, Comparer <TGroupKey> .Create(Comparer)); } foreach (var group in groups) { var node = new TreeNodeViewModel { NodeText = TextSelector(group.Key), NodeObj = group.Key }; node.SubItems.AddRange(group.OfType <object>()); root.AddNode(node); } }
public TreeNodeViewModel Execute(IList <TItem> items) { var root = new TreeNodeViewModel(); if (items == null || items.Count == 0) { return(root); } GroupBy(root, items, 0); return(root); }
private void GroupBy(TreeNodeViewModel parentNode, IList <TItem> groupItems, int groupIndex) { if (groupIndex >= _groupBys.Count) { _itemBy.Execute(parentNode, parentNode.SubItems.OfType <TItem>().ToList()); return; } var groupExecutor = _groupBys[groupIndex]; groupExecutor.Execute(parentNode, groupItems); foreach (var node in parentNode.Nodes) { GroupBy(node, node.SubItems.OfType <TItem>().ToList(), groupIndex + 1); } }
public TreeViewViewModel Execute(IList <TItem> items) { var result = new TreeViewViewModel(); if (items == null || items.Count == 0) { return(result); } var root = new TreeNodeViewModel(); GroupBy(root, items, 0); foreach (var node in root.Nodes.ToList()) { result.AddNode(node); root.RemoveNode(node); } return(result); }
protected abstract IEnumerable <IGrouping <TGroupKey, TItem> > Group(TreeNodeViewModel root, IList <TItem> items);
protected override IEnumerable <IGrouping <TGroupKey, TItem> > Group(TreeNodeViewModel root, IList <TItem> items) { return(items.GroupBy(item => KeySelector(item, (TParentGroupKey)root.NodeObj))); }