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


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

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

    1. 业务实体

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

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

    2. 准备数据

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

            void MainPage_Loaded(object sender, RoutedEventArgs e)
            {
                var result = new[]{
                    new Folder(){Name="Test",Folders =new ObservableCollection<Folder>(
                        new[]{
                            new Folder(){Name="Test4"},
                            new Folder(){Name="Test3"},
                            new Folder(){Name="Test4",Folders=new ObservableCollection<Folder>(
                                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

  • 相关阅读:
    Linux目录结构
    Linux简介
    队列、生产者消费者模型
    Process的几个用法和守护进程
    并发编程(初学)
    网络编程知识点小结
    用socketserver模块实现并发
    粘包问题、解决粘包问题和struct模块
    模拟ssh功能和subprocess模块
    socket 套接字编程
  • 原文地址:https://www.cnblogs.com/chenxizhang/p/2087692.html
Copyright © 2020-2023  润新知