3

我使用 MVVM 作为我的 WPF 架构,并且我有一个 WPF TreeView 实现为延迟加载(子项在您展开之前不会递归加载)。

但是,我还需要在扩展时实现异步加载。有没有办法做到这一点?我需要将其保持在控制级别,而不是代码隐藏/应用程序级别。

谢谢

4

4 回答 4

2

为什么需要在控件本身中实现这一点?

假设这不是绝对要求,我将在返回指定节点的子节点的属性中处理这个问题。如果尚未填充子对象,则使用后台线程加载子对象,并在找到它们时通知 UI 线程,然后将子对象添加到子对象集合中。假设您正在使用一个ObservableCollection(或至少一个实现 的集合INotifyCollectionChanged),随着子元素的添加,它们将异步出现在 UI 中。

于 2009-09-15T22:51:27.443 回答
0

以下是如何做到这一点:

  1. 创建 IEnumerable 类型的附加属性
  2. 在属性的 PropertyChanged 处理程序中,将 sender 强制转换为 TreeViewItem 并检查 IsExpanded 属性。
  3. 如果 IsExpanded 为真,则在 ApplicationPriority.ApplicationIdle 优先级执行 Dispatcher.BeginInvoke 到您的填充例程
  4. 如果 IsExpanded 为假,则设置一个事件以检测它何时变为真,并在回调中执行 Dispatcher.BeginInvoke 到您的填充例程
  5. 在您的填充例程中,将目标控件的 ItemsSource 设置为附加的属性值
  6. 使用样式在 TreeViewItem 上设置附加属性,而不是通过 HierarchicalDataTemplate 设置它(在此处省略 ItemsSource)

这可以防止 TreeViewItem 在展开之前设置其 ItemsSource。创建此机制是一些工作,但一旦创建,您可以通过简单地从 HierarchicalDataTemplate 中删除 ItemsSource 并将其设置在 ItemContainerStyle 中来进行任何 TreeView 延迟加载。

于 2010-03-03T19:13:11.827 回答
0

如果您使用延迟加载和 HierarchicalDataTemplates,您将只会获得您选择加载的项目。请记住,TreeView 需要加载低于它所显示内容的一级,以确定它是否应该显示展开/折叠切换按钮

于 2009-09-16T14:32:28.603 回答
-3

对于每个需要延迟加载的 UI 元素,我都使用了“查看 GUID”。

举例说明:

  1. 一开始,Control.Tag = "0000-0000 ...."
  2. 用户进行交互,
    • 生成一个随机的 GUID,即 guid1
    • Control.Tag = guid1
    • 创建一个线程,它需要(做什么,控制,guid1)
  3. 在这两者之间,用户进行另一次交互
    • 生成一个随机 GUID(这次是 guid2)
    • Control.Tag = guid2
    • 创建一个线程,它需要(做什么,控制,guid2)
  4. 第一个线程完成:
    • 它在 UI 线程中调用代码,该线程获取结果和执行前获得的 guid
    • 调用的代码检查 Control.Tag != guid1,没有做任何改变
  5. 第二个线程完成:
    • 它在 UI 线程中调用代码,该线程获取结果和执行前获得的 guid
    • 调用的代码看到 Control.Tag == guid2,进行更改
于 2010-03-03T06:42:30.397 回答