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
s绑定到它:treevieItem
<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;
打破
}
}
}
发现返回;
}