这是一个follow-up问题。
我过滤了TreeView
控件的顶级节点,如下所示。
private void ApplyFilterHandler(object sender, RoutedEventArgs e)
{
if (_filterCheckBox.IsChecked.Value)
CollectionViewSource.GetDefaultView(TopLevelNodes).Filter += MyFilter;
else
CollectionViewSource.GetDefaultView(TopLevelNodes).Filter -= MyFilter;
}
<TreeView ItemsSource="{Binding TopLevelNodes}">
...
</TreeView>
当用户应用过滤器时,所有节点都会折叠。
问题
如何在保留其他节点的展开状态的同时隐藏树中的某些节点?
有人可以解释一下ICollectionView.Filter += MyFilter
内部会发生什么。
感谢您的时间。
答案 0 :(得分:-1)
在这种情况下Reflector总是你的朋友。我假设在内部调用ICollectionView.Refresh()
以反映由添加/删除过滤器引起的更改。这有效地重新枚举了TreeView
。
为了弥补这一点,您可以随时获取所有树项的状态,并在刷新后重新应用它们。这可能不是您正在寻找的简单解决方案。
您可能还想尝试设置MyFilter
一次,然后以编程方式调用ICollectionView.Refresh()
。然后,您的MyFilter
应根据_filterCheckBox.IsChecked
值进行过滤。这可能会有所不同,但这些都只是想法。你必须亲自试试。