C# 是否可以滚动到';虚拟化treeview时,它不可见吗?

C# 是否可以滚动到';虚拟化treeview时,它不可见吗?,c#,wpf,xaml,C#,Wpf,Xaml,我一直试图让它滚动时,树视图是虚拟化的。我在没有虚拟化的情况下取得了成功,但树视图的加载时间太长 问:有可能吗?我该怎么做呢?一种可能的方法是改变使用TreeViews的方式。使用数据绑定控制选择和扩展。这样WPF将为您完成所有工作 为每个树节点创建视图模型,并添加IsSelected和IsExpanded属性 使用ItemContainerStyle将treevieItems绑定到它: <TreeView.ItemContainerStyle> <S

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


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

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

  • 为每个树节点创建视图模型,并添加
    IsSelected
    IsExpanded
    属性
  • 使用
    ItemContainerStyle
    treevieItem
    s绑定到它:

        <TreeView.ItemContainerStyle>
            <Style TargetType="TreeViewItem">
                <Setter Property="IsExpanded"
                        Value="{Binding IsExpanded, Mode=TwoWay}" />
                <Setter Property="IsSelected"
                        Value="{Binding IsSelected, Mode=TwoWay}" />
            </Style>
        </TreeView.ItemContainerStyle>
    
    
    
  • 现在您可以编写代码来处理树的数据,其余的工作将由绑定来完成

下面是一个通用的
节点
视图模型和递归方法的示例,该方法搜索与值匹配的第一个节点,并在此过程中展开和选择节点:

    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;
    }
class节点:INotifyPropertyChanged//应该在所有属性上正确实现这一点,以便绑定工作
{
公共布尔展开{get;set;}
公共布尔值被选为{get;set;}
公共T值{get;set;}
公共可观察集合子项{get;}
}
bool TryFindNode(节点节点,T值)
{
bool-wasFound=false;
if(等于(node.Value,Value))
{
node.IsExpanded=true;
node.IsSelected=true;
wasFound=true;
}
其他的
{
foreach(node.Children中的var childNode)
{
if(SearchNode(childNode,searchText))
{
node.IsExpanded=true;
wasFound=true;
打破
}
}
}
发现返回;
}