WPF:过滤TreeView而不折叠它的节点

时间:2010-04-23 16:41:33

标签: wpf treeview filter

这是一个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内部会发生什么。

感谢您的时间。

1 个答案:

答案 0 :(得分:-1)

在这种情况下Reflector总是你的朋友。我假设在内部调用ICollectionView.Refresh()以反映由添加/删除过滤器引起的更改。这有效地重新枚举了TreeView

中的节点

为了弥补这一点,您可以随时获取所有树项的状态,并在刷新后重新应用它们。这可能不是您正在寻找的简单解决方案。

您可能还想尝试设置MyFilter一次,然后以编程方式调用ICollectionView.Refresh()。然后,您的MyFilter应根据_filterCheckBox.IsChecked值进行过滤。这可能会有所不同,但这些都只是想法。你必须亲自试试。