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>
下面是树状控件延时加载数据的实现方式:
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>
相关文章推荐
- 实现界面图片的延时加载
- js实现网页图片延时加载的原理和代码 提高网站打开速度
- Fragment的setUserVisibleHint方法实现延时加载
- 关联加载IRelationLoad的实现代码(即时和延时)
- 实现treeview快速加载
- TreeView的异步延时加载
- 【WPF】 实现Treeview 的拖拽
- 【WPF】如何让TreeView实现右键选中的功能
- 实现treeview的动态加载
- 采用MVVM方式实现WPF的TreeView
- 如何实现具有层次结构的 TreeView <四> (WPF/TreeView/Style/Template)
- js实现网页图片延时加载的原理和代码
- ScheduledThreadPoolExecutor实现定时器和延时加载功能
- 在WPF的TreeView中实现右键选定
- Asp.net TreeView异步加载数据,并结合checkbox实现多选删除
- 原生javascript实现图片滚动、延时加载功能
- 原生javascript实现图片滚动、延时加载功能
- 潜移默化学会WPF(Treeview异步加载节点)
- js实现网页图片延时加载的原理和代码
- Android使用Fragment的setUserVisibleHint方法实现延时加载