Wpf TreeView 延时加载实现

来源:互联网 发布:小型企业网络搭建 编辑:程序博客网 时间:2024/06/06 15:17

树状控件在程序中经常用到。 但如果树状结构比较大,数据较多,将所有数据都加载后再绑定到控件,会影响软件的运行速度。比较理想的解决方法是延时加载,在展开树的时候再加载数据。

下面是树状控件延时加载数据的实现方式:

ViewModel: 

 public   class TaskFolderVM:WorkspaceVM
  {
      #region Data&Properties
      TaskFolder _taskFolder;

        public TaskFolderVM Parent { get; set; }  

 

 

//增加 一个静态的虚拟子项;

       static TaskFolderVM _dummyChild = new TaskFolderVM(); 

 

ObservableCollection<TaskFolderVM> _subFolderVMs;

  public ObservableCollection<TaskFolderVM> SubFolderVMs
      {
          get
          {

              if (_subFolderVMs == null)
              {
                  this._subFolderVMs = new ObservableCollection<TaskFolderVM>();
                  this._subFolderVMs.Add(_dummyChild);

                 // 初始化时只加载虚拟子项

              }

              return _subFolderVMs;
          }
      }

 

     bool _isExpanded;
      public bool IsExpanded  /*与treeview item IsExpanded 双向绑定*/
      {
          get
          {
              return this._isExpanded;
          }
          set
          {
              if (this._isExpanded == value) return;
              this._isExpanded = value;
              if (this.SubFolderVMs == null || this.HasDummyChild())

              // 当展开treeview时, 再实际加载子项集合;
                  this.GetSubFolders();


              base.OnPropertyChanged("IsExpanded");
            }
      }

 

// 判断是否包含虚拟子项

  private bool HasDummyChild() 
      {
          return (this._subFolderVMs.Count == 1 && this._subFolderVMs.Contains(_dummyChild));
      }

 

 

   this.GetSubFolders()

{

  /* 在此加载子项*/

}

 

}

 

 

 

View:

 

 <TreeView ItemsSource="{Binding WorkingFolderRoots}"
                              SelectedItemChanged="TreeView_SelectedItemChanged"

                  >
                        <TreeView.ItemContainerStyle>

                            <Style TargetType="{x:Type TreeViewItem}">
                                <Setter Property="IsExpanded" Value="{Binding IsExpanded, Mode=TwoWay}" />
                                <Setter Property="IsSelected" Value="{Binding IsSelected, Mode=TwoWay}" />
                                <Setter Property="FontWeight" Value="Normal" />
                                <Style.Triggers>
                                    <Trigger Property="IsSelected" Value="True">
                                        <Setter Property="FontWeight" Value="Bold" />

                                    </Trigger>
                                </Style.Triggers>
                            </Style>
                        </TreeView.ItemContainerStyle>
                        <TreeView.ItemTemplate>
                            <HierarchicalDataTemplate ItemsSource="{Binding SubFolderVMs}" >
                                <Grid Margin="5,0" Height="30">
                                    <ContentPresenter Content="{Binding Name}"      
                                             Margin="5,0"  VerticalAlignment="Center"
                                                      />

                                </Grid>
                            </HierarchicalDataTemplate>
                        </TreeView.ItemTemplate>
       </TreeView>

 

 


 

 

0 0
原创粉丝点击