您的位置:首页 > 其它

Wpf TreeView 延时加载实现

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

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

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>

 

 

 

 
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: