如何强制ItemContainerGenerator为项目生成容器或如何在启用UI虚拟化时将TreeView滚动到展开的节点?

时间:2013-02-06 14:27:59

标签: wpf mvvm treeview ui-virtualization itemcontainergenerator

TreeView没有ScrollIntoView()方法
唯一的方法是为相应的数据项容器调用TreeVewItem.BringIntoView() 但是,如果node不可见且尚未生成容器,ItemsControl.ItemContainerGenerator.ContainerFromItem()将返回null

因此应该有一些方法可以强制ItemContainerGenerator为项目创建容器。

合理的问题是:如何扩展节点并保持隐身?!

轻松! IsExpanded绑定到VM的属性。 UI虚拟化按预期工作:
当手动滚动到项目时,TreeViewItem.Expanded的事件hanlder被调用。

1 个答案:

答案 0 :(得分:1)

我不能保证这个问题足够类似于帮助,但我想因为我找不到自己的问题的好答案我会在这里发布,因为这是类似的,我想出了如何解决我的问题

我正在使用 Canvas 控件,并且具有放置在该画布上的复杂UI元素,并将 ItemsControl 控件作为其XAML UI定义的一部分。 ItemsControl的已在 ItemTemplates 中设置 DataTemplates

因此,只有在更新了Visual Tree后,我的对象的某些方面才会完全生成。这不是拖拽和在处理画布时使用项目的问题,因为 ItemContainerGenerator 已经在我需要时生成了项目。但是在尝试在可视化树绘制自身之前在Canvas加载时从数据库重新生成项目时,这是一个问题。

我发现解决这个问题的唯一真正方法是,只有在LayoutUpdated事件发生后才开始在画布上放置“辅助对象”(绑定到 ItemContainerGenerators 制作的对象的对象)因为画布已被解雇了。

public class DesignerCanvas : Canvas
{
  public void LoadCanvasFromDB()
  {
    ...
    [loading items from the database, part one]
    LayoutUpdated += DesignerCanvas_LayoutUpdated;
  }

  void DesignerCanvas_LayoutUpdated(object sender, EventArgs e)
  {
    LayoutUpdated -= DesignerCanvas_LayoutUpdated;
    [loading items from the database which tie to UI elements from part one]