我一直在尝试在树视图虚拟化时滚动它。我没有虚拟化时取得了成功,但是加载树视图的时间太长了。
问:有可能吗?我该怎么做呢?
答案 0 :(得分:0)
一种可能的方法是改变您使用TreeView
的方式。使用数据绑定来控制选择和扩展。通过这种方式,WPF将为您完成所有工作。
IsSelected
和IsExpanded
属性使用ItemContainerStyle
将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;
}