WPF TreeView和虚拟化(UI和数据)

Att*_*lah 3 .net c# wpf

我有一个层次结构,如下所示:

 class User
  {
     public List<Contract> Contracts{get;set;}
  }

  class Contract
  {
     public List<Group> Groups{get;set;}
  }

  class Group
  {
     public List<Article> Articles{get;set;}
  }

  class Article
  {
      public string Name{get;set;}
      public string Id{get;set;}
  }
Run Code Online (Sandbox Code Playgroud)

每个用户都有一些与他相关的合同,每个合同都有一些与他相关的团体,每个团体都有一些文章.

我在WPF中使用TreeView(带有http://www.codeproject.com/KB/WPF/TreeViewWithCheckBoxes.aspx中的复选框)直观地表示这个:

(单击每个用户在TreeView中显示此结构):

>Contract1
  >Group1
    >Article1
    >Article2
    >Article3
    >Article4
    ...
  >Group2
  >Group3
  ------------
  Add Button
  Remove Button
  -------------
Run Code Online (Sandbox Code Playgroud)

使用先前屏幕,用户可以通过选中它们并单击"添加"按钮或通过单击"删除按钮"将其删除来向其帐户添加其他文章或合同或组.

问题是每个小组都有成千上万的文章,我不想立刻将它们全部记在内存中,因为它会减慢速度.

你能想到更好的处理方法吗?

sll*_*sll 5

由于WPF 3.5 SP1存在VirtualizationMode.Recycling虚拟化模式,它允许重用项容器,并且每次用户滚动Items Control时都不会创建新的容器.

当VirtualizationMode设置为Recycling时,VirtualizingStackPanel会重复使用项容器,而不是每次都创建一个新容器.

试用

<TreeView
    VirtualizingStackPanel.IsVirtualizing = "True"
    VirtualizingStackPanel.VirtualizationMode = "Recycling" />
Run Code Online (Sandbox Code Playgroud)

为了使它适用于TreeView,请看这个SO帖子:( 我不会复制/粘贴XAML) Treeview上的VirtualizingStackPanel不是虚拟化

有用的MSDN链接: