我使用 MVVM 作为我的 WPF 架构,并且我有一个 WPF TreeView 实现为延迟加载(子项在您展开之前不会递归加载)。
但是,我还需要在扩展时实现异步加载。有没有办法做到这一点?我需要将其保持在控制级别,而不是代码隐藏/应用程序级别。
谢谢
我使用 MVVM 作为我的 WPF 架构,并且我有一个 WPF TreeView 实现为延迟加载(子项在您展开之前不会递归加载)。
但是,我还需要在扩展时实现异步加载。有没有办法做到这一点?我需要将其保持在控制级别,而不是代码隐藏/应用程序级别。
谢谢
为什么需要在控件本身中实现这一点?
假设这不是绝对要求,我将在返回指定节点的子节点的属性中处理这个问题。如果尚未填充子对象,则使用后台线程加载子对象,并在找到它们时通知 UI 线程,然后将子对象添加到子对象集合中。假设您正在使用一个ObservableCollection
(或至少一个实现 的集合INotifyCollectionChanged
),随着子元素的添加,它们将异步出现在 UI 中。
以下是如何做到这一点:
这可以防止 TreeViewItem 在展开之前设置其 ItemsSource。创建此机制是一些工作,但一旦创建,您可以通过简单地从 HierarchicalDataTemplate 中删除 ItemsSource 并将其设置在 ItemContainerStyle 中来进行任何 TreeView 延迟加载。
如果您使用延迟加载和 HierarchicalDataTemplates,您将只会获得您选择加载的项目。请记住,TreeView 需要加载低于它所显示内容的一级,以确定它是否应该显示展开/折叠切换按钮
对于每个需要延迟加载的 UI 元素,我都使用了“查看 GUID”。
举例说明: