This one is a follow-up question.
I filter the top level nodes of a TreeView
control like shown below.
private void ApplyFilterHandler(object sender, Routed开发者_如何学运维EventArgs e)
{
if (_filterCheckBox.IsChecked.Value)
CollectionViewSource.GetDefaultView(TopLevelNodes).Filter += MyFilter;
else
CollectionViewSource.GetDefaultView(TopLevelNodes).Filter -= MyFilter;
}
.
<TreeView ItemsSource="{Binding TopLevelNodes}">
...
</TreeView>
When the user applies the filter all nodes get collapsed.
Question
How can I hide certain nodes in a tree while retaining the expand state of the other nodes? Can someone explain, what happens internally onICollectionView.Filter += MyFilter
.
Thanks for your time.
In cases such as this Reflector is always your friend. I presume that ICollectionView.Refresh()
is called internally to reflect the changes caused by adding/removing a filter. This effectively re-enumerates the nodes in the TreeView
.
To compensate for this you can always grab the state of all tree items and re-apply them after a refresh. This may not be the easy solution you were looking for.
You may also want to try to set MyFilter
once and call ICollectionView.Refresh()
programmatically. Your MyFilter
should then filter according to _filterCheckBox.IsChecked
value. This could make a difference but these are all merely ideas. You must try them yourself.
精彩评论