How to filter a wpf treeview hierarchy using an ICollectionView? How to filter a wpf treeview hierarchy using an ICollectionView? wpf wpf

How to filter a wpf treeview hierarchy using an ICollectionView?


This is how I filtered the items on my TreeView:

I have the class:

class Node{    public string Name { get; set; }    public List<Node> Children { get; set; }    // this is the magic method!    public Node Search(Func<Node, bool> predicate)    {         // if node is a leaf         if(this.Children == null || this.Children.Count == 0)         {             if (predicate(this))                return this;             else                return null;         }         else // Otherwise if node is not a leaf         {             var results = Children                               .Select(i => i.Search(predicate))                               .Where(i => i != null).ToList();             if (results.Any()){                var result = (Node)MemberwiseClone();                result.Items = results;                return result;             }             return null;         }                 }}

Then I could filter results as:

// initialize Node root// pretend root has some children and those children have more children// then filter the results as:var newRootNode = root.Search(x=>x.Name == "Foo");


The only way I've found to do this (which is a bit of a hack), is to create a ValueConverter that converts from IList to IEnumerable. in ConvertTo(), return a new CollectionViewSource from the passed in IList.

If there's a better way to do it, I'd love to hear it. This seems to work, though.


Unfortunately there is no way to make same Filter apply to all nodes automatically. Filter is a property (not a DP) of ItemsCollection which is not DependencyObject and so DP Value inheritance isn't there.

Each node in the tree has its own ItemsCollection which has its own Filter. The only way to make it work is to manually set them all to call the same delegate.

Simplest way would be to expose Filter property of type Predicate<object> at your ToolBoxViewModel and in its setter fire an event. Then ToolboxItemViewModel will be responsible for consuming this event and updating its Filter.

Aint pretty and I'm not sure what the performance would be like for large amounts of items in the tree.