0

当树视图被虚拟化时,我一直试图让它滚动。当它没有被虚拟化时我已经成功了,但是加载树视图的时间太长了。

问:可以吗?我该怎么做呢?

4

1 回答 1

0

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

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

        <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;
    }
于 2013-10-08T11:40:37.643 回答