在Silverlight中使用HierarchicalDataTemplate为TreeView实现递归树状结构

这是项目中一个页面上的一个功能。我们需要在界面上通过一个TreeView控件显示一个递归的树状结构,也就是说会很多层嵌套的节点,而且层数是不确定的。

这个功能,可以通过HierarchicalDataTemplate来很方便地实现

1. 业务实体

作为举例,我定义了一个大家都很熟悉的Folder类型,即文件夹。我们都知道,文件夹又可以包含子文件夹,而且可以多层嵌套。所以,这是一个递归的结构体。

    public class Folder
    {
        public string Name { get; set; }
        public ObservableCollection
  
  
   
    Folders { get; set; }
    }

  
  

2. 准备数据

我用下面的代码,模拟一个数据读取操作。下面是硬编码出来的数据。实际情况下,可以读取数据库。

        void MainPage_Loaded(object sender, RoutedEventArgs e)
        {
            var result = new[]{
                new Folder(){Name="Test",Folders =new ObservableCollection
  
  
   
   (
                    
   
   new[]{
                        
   
   new Folder(){Name=
   
   "Test4"},
                        
   
   new Folder(){Name=
   
   "Test3"},
                        
   
   new Folder(){Name=
   
   "Test4",Folders=
   
   new ObservableCollection
   
   
    
    (
                            
    
    new []{
    
    new Folder(){Name =
    
    "Test5"}})
                        }
                    })}};

            tvFolders.ItemsSource = result;
        }
   
   
  
  

3. 绑定控件

<UserControl x:Class="SilverlightTreeviewSample.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    d:DesignHeight="300" d:DesignWidth="400" xmlns:sdk="http://schemas.microsoft.com/winfx/2006/xaml/presentation/sdk">
    
    <UserControl.Resources>
        <sdk:HierarchicalDataTemplate x:Key="FolderItemTemplate" ItemsSource="{Binding Folders}">
            <TextBlock Text="{Binding Name}">
   
   TextBlock>
        
    
    sdk:HierarchicalDataTemplate>
        <Style TargetType="sdk:TreeViewItem">
            <Setter Property="IsExpanded" Value="True">
     
     Setter>
        
      
      Style>
       
     
       UserControl.Resources> <Grid x:Name="LayoutRoot" Background="White"> <sdk:TreeView Name="tvFolders" ItemTemplate="{StaticResource FolderItemTemplate}">  
        sdk:TreeView>  
         Grid>  
          UserControl> 

请注意,我们这里用到一个特殊的DataTemplate:HierarchicalDataTemplate,并且将其设置为Treeview的ItemTemplate。

 

4. 查看效果

image

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值