The problem: We want to bind a HierarchicalDataTemplate’s ItemsSource property to a CollectionViewSource, to perform grouping and filtering.
The background: The original issue we were working on had to do with filtering a TreeView. Specifically, we found that using a CollectionViewSource to filter worked but caused the TreeView nodes to collapse. It's likely because the View’s Refresh function regenerates its list of objects which causes the TreeView to regenerate its nodes, causing the original nodes’ expansion states to be lost. We resolved this by writing a class that is similar to CollectionViewSource but preserves the View by editing the object list in place so that when it changes due to filtering, the associated TreeView nodes aren’t destroyed.
This has worked perfectly for us and we’d like to use it at deeper levels in our TreeView, bringing us back to our problem. Currently, we have a HierarchicalDataTemplate that looks like this:
<HierarchicalDataTemplate
x:Key="tableTemplate"
ItemsSource="{Binding Path=DataItems}"
ItemTemplateSelector="{StaticResource tableGroupsTemplateSelector}"
>
Instead, we want it to behave like this:
<HierarchicalDataTemplate
x:Key="tableTemplate"
ItemTemplateSelector="{StaticResource tableGroupsTemplateSelector}"
>
<HierarchicalDataTemplate.ItemsSource>
<Binding>
<Binding.Source>
<CollectionViewSource
Source="{Binding Path=DataItems}"
/>
</Binding.Source>
</Binding>
</HierarchicalDataTemplate.ItemsSource>
Unfortunately, this approach doesn’t seem to work. From what we can tell, the binding within the CVS never fires; no binding errors are raised; we tried attaching a converter and setting a breakpoint but the breakpoint was never hit. We’ve also tried various other solutions, including: using RelativeSource, moving the CollectionViewSource into the template’s Resources, and incorporating TreeViewItem’s into the template. However, nothing has worked.
As an aside, I do realize that a ViewModel approach would enable filtering. However, I'm at a place in our development cycle where I can't make that type of change so I'm looking for alternatives, like the CollectionViewSource approach.
Any help you can give would be appreciated.
Thanks,
-Craig