WPF虚拟化Treeview中的滚动错误

时间:2010-11-02 02:17:23

标签: c# wpf treeview

我在WPF中使用虚拟化树视图来显示具有更多子节点(5000 +)的3级深度层次结构。

<TreeView Grid.Row="0" Grid.Column="0" Name="TestTree"  ItemsSource="{Binding}" VirtualizingStackPanel.IsVirtualizing="True">
...
</TreeView>

如果我在第3级展开子节点并滚动到最后,内容无法正确显示,滚动条“翻转”,我可以继续向下滚动,行为重复更多滚动。

这只发生在虚拟化模式下,但遗憾的是由于子节点数量很大,树视图在非虚拟化模式下的加载时间过长。

我已经阅读了SO here上的以下链接和MSDN论坛here上的原始帖子,但是在SelectedItemChanged处理程序中调用UpdateLayout()的建议解决方法对我不起作用。

之前有没有其他人遇到过这种奇怪的行为,如果有的话会有解决方法吗?

感谢任何意见 - 谢谢!

1 个答案:

答案 0 :(得分:0)

你尝试加载懒惰的物品吗?我的意思是你可以首先加载(不虚拟化)只有根节点,然后当这些节点中的每个节点都被扩展时加载它的孩子。

在这种情况下,我通常使用TreeViewItemViewModelClass,如:

public class TreeViewItemViewModel : INotifyPropertyChanged
{
    public IEnumerable<TreeViewItemViewModel> Childs { get; }
    public bool IsSelected { get; set; }
    public bool IsExpanded { get; set; }
    (...)
}

然后在TreeView的ItemContainerStyle中使用TwoWay绑定绑定IsSelected和IsExpanded属性,然后在属性IsExpanded的setter中加载它的所有子项。

我已经测试了这种方法,理论上树有超过5000个项目,但从不同时加载所有项目。

希望这会有所帮助......