Pav*_*nin 5 wpf treeview ui-virtualization mvvm itemcontainergenerator
TreeView没有ScrollIntoView()方法,
唯一的方法是调用TreeVewItem.BringIntoView()相应的数据项容器。
但如果节点不可见并且尚未生成容器,ItemsControl.ItemContainerGenerator.ContainerFromItem()将返回null。
因此应该有某种方法强制 ItemContainerGenerator 为项目创建容器。
合理的问题是:节点如何扩展并且保持不可见?!
简单的!IsExpanded与VM的属性绑定。UI 虚拟化按预期工作:
仅当手动滚动到项目完成时,才会调用 TreeViewItem.Expanded 的事件处理程序。
我不能保证这个问题足够相似以提供帮助,但我想既然我无法为自己的问题找到一个好的答案,我会在这里发布,因为这是相似的,并且我想出了如何解决我的问题。
我正在使用Canvas控件,并且将复杂的 UI 元素放置在该画布上,并将ItemsControl控件作为其 XAML UI 定义的一部分。ItemsControl在其ItemTemplates中定义了DataTemplates集。
因此,只有在更新可视化树后,我的对象的某些方面才会完全生成。在画布上工作时拖放和处理项目不是问题,因为 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]
Run Code Online (Sandbox Code Playgroud)