是否可以滚动到树视图虚拟化时不可见的treeviewitem?

时间:2013-10-08 10:33:03

标签: c# wpf xaml

我一直在尝试在树视图虚拟化时滚动它。我没有虚拟化时取得了成功,但是加载树视图的时间太长了。

问:有可能吗?我该怎么做呢?

1 个答案:

答案 0 :(得分:0)

一种可能的方法是改变您使用TreeView的方式。使用数据绑定来控制选择和扩展。通过这种方式,WPF将为您完成所有工作。

  • 为每个树节点创建一个视图模型,并添加IsSelectedIsExpanded属性
  • 使用ItemContainerStyleTreeViewItem绑定到它:

        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsExpanded"
                        Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected"
                        Value="{Binding IsSelected, Mode=TwoWay}" />
            </Style>
        </TreeView.ItemContainerStyle>
    
  • 现在你可以编写操作树的数据的代码,绑定将完成剩下的工作。

以下是通用Node<T>视图模型和递归方法的示例,该方法搜索与值匹配的第一个节点,沿途展开和选择节点:

    class Node<T> : INotifyPropertyChanged // should implement this properly on all properties for binding to work
    {
        public bool IsExpanded { get; set; }
        public bool IsSelected { get; set; }

        public T Value { get; set; }

        public ObservableCollection<Node<T>> Children { get; }
    }

    bool TryFindNode<T>(Node<T> node, T value)
    {
        bool wasFound = false;

        if (Equals(node.Value, value))
        {
            node.IsExpanded = true;
            node.IsSelected = true;
            wasFound = true;
        }
        else
        {
            foreach (var childNode in node.Children)
            {
                if (SearchNode(childNode, searchText))
                {
                    node.IsExpanded = true;
                    wasFound = true;
                    break;
                }
            }
        }

        return wasFound;
    }