如果使用了WPF而不使用数据绑定(手工在界面和数据间进行同步),总会感觉不值.但是大部分讨论WPF数据绑定的文章,主题大多集中在ListBox这样平坦的数据集合上,讲如何绑定层次结构数据的比较少,这里我就通过一个简单的显示磁盘目录树的例子来展示如何完成这样的任务.

第一步,当然是定义要绑定的数据类型了.

在目录树这个例子中,每个TreeViewItem要显示的数据可以用System.IO.DirectoryInfo来表示,但是这样做有一个麻烦:DirectoryInfo只能通过GetDirectories()方法来获取子目录,但是WPF里的数据绑定则更倾向于使用属性在数据间导航,所以为了更方便地使用数据绑定,我们最好还是自定义一个类来完成这样的工作:

using System.Collections.Generic;
using System.IO;

namespace WpfApplication1
{

    class BindDirectory
    {
        public BindDirectory(string directoryPath)
        {
            //正规化目录路径,确保Path以'\\'结尾
            directoryPath = directoryPath.TrimEnd('\\');
            Path = directoryPath + '\\';

            //计算出目录名称(不包含路径)
            int indexLastSlash = directoryPath.LastIndexOf('\\');
            if (indexLastSlash >= 0)
            {
                Name = directoryPath.Substring(indexLastSlash + 1);
            }
            else
            {
                Name = directoryPath;
            }
        }

        public string Name
        {
            get;
            private set;
        }

        public string Path
        {
            get;
            private set;
        }

        public IEnumerable<BindDirectory> Directories
        {
            get
            {
                //延迟加载
                if (directories == null)
                {
                    directories = new List<BindDirectory>();
                    foreach (string d in Directory.GetDirectories(Path))
                    {
                        directories.Add(new BindDirectory(d));
                    }
                }
                return directories;
            }

        }
        List<BindDirectory> directories;
    }
}

这个类所作的工作很简单,就是正规化目录路径,获取目录名称,以及延迟加载子目录(以提升性能)的列表,我们的界面也只要求它具有这些功能就行了.

第二步,创建一个数据提供类(DataProvider)

我们可以在Window的代码里设置界面的DataContext,ItemsSource等属性来让界面显示指定的数据,也可以构造一个专门提供数据的类,完全在界面(XAML)里指定,这里使用的是第二种方法:

using System.Collections.Generic;
using System.IO;

namespace WpfApplication1
{
    class BindDirectoryList : List<BindDirectory>
    {
        public BindDirectoryList()
        {
            foreach (var drive in DriveInfo.GetDrives())
            {
                Add(new BindDirectory(drive.RootDirectory.FullName));
            }
        }
    }
}

这个类就更简单了,仅仅是在创建的时候加载所有的磁盘的根目录.

第三步,设计用户界面

只需要在Window中添加一个TreeView,然后修改几行代码,就能轻松地显示我们的数据了:

<!--xml:sample这一行用来引入我们自己代码的命名空间-->
<Window x:Class="WpfApplication1.Window1"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:sample="clr-namespace:WpfApplication1"
    Title="Window1" Height="300" Width="300">
    <Window.Resources>
        <!--引入我们自己的数据提供对象-->
        <ObjectDataProvider x:Key="drives" ObjectType="{x:Type sample:BindDirectoryList}" />
        <!--设置如何显示数据,以及如何获取下一级数据的列表-->
        <HierarchicalDataTemplate x:Key="itemTemplate" DataType="{x:Type sample:BindDirectory}" ItemsSource="{Binding Directories}">
            <TextBlock Text="{Binding Name}" />
        </HierarchicalDataTemplate>
    </Window.Resources>
    <TreeView ItemsSource="{Binding Source={StaticResource drives}}"
             ItemTemplate="{StaticResource itemTemplate}" >
    </TreeView>
</Window>

这里我们在XAML里定义了一个drives对象,它的类型为BindDirectoryList,创建时会自动加载磁盘的根目录;
我们还定义了一个针对BindDirectory类型的层次型数据模板itemsTemplate,指定了要获取此类型的数据的子数据需要通过Directories属性,并且告诉WPF用一个TextBlock来显示它的名称.
最后,我们设置一下TreeView的ItemsSource和ItemTemplate就完成工作了.

运行截图:

学习WPF: 创建数据绑定目录树相关推荐

  1. 表达式目录树(Expression)

    表达式目录树 什么是表达式目录树呢?用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它 将代码表示成一个对象树,而不是可执行的代码.这个跟汇编原理一样,我们找到关键字,把 ...

  2. 看很多人要求目录树,我的代码可以满足大多数要求 作  者: flyxxxxx (灭神)

    <script language="javascript" type="text/javascript"> document.title=" ...

  3. C#表达式目录树系列之1 -- 表达式目录树基本概念

    概要 本文主要是帮助读者搞清楚什么是表达式目录树,表达书目录树能做什么,如何创建表达式目录树.后续几篇文章侧重于表达式目录树的具体应用. 表达式目录树是什么 表达式目录树是一种树型结构,它将代码以数据 ...

  4. 《Linux C编程环境》 课程大实验 及近期练习题:计算器,复写机,目录树创建,批处理执行器,扫雷

    <Linux C编程环境> 课程大实验 及近期练习题:计算器,复写机,目录树创建,批处理执行器,扫雷 ​ 之前作业的题了,征求了老师的意见,同意我把个人解析放开公布,再提交作业已经无效了. ...

  5. Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略

    Python语言学习:创建/删除文件/文件夹.获取当前文件/文件夹路径(系统环境路径/目录).获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略 目录 系统环境路径的设置 1.sys ...

  6. bat文件打开一闪就没了_window文件夹目录树的创建

    问题描述 当我们的项目文件夹逐渐丰满,各类文件种类繁多,为了增强项目资料的自明性,便于资料管理和交接,有必要对项目文件进行汇总说明. 要进行文件汇总,首先要提取文件的目录树. 什么是目录树呢?在cmd ...

  7. python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...

    我们现在是学习Linux,Linux是服务器.云计算方面的东西,我要把这些东西都掌握,我们现在要开始去学,那我们现在在桌面专门建一个文件夹,名字叫做Linux,这个文件夹用来保存我们专门去学习的东西. ...

  8. C#学习基本概念---xcopy(复制文件和目录树)

    XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行COPY.除非 ...

  9. C#表达式目录树系列之5 –动态创建查询表达式

    概要 在项目开发中,根据用户的需求,一般来是,我们的查询表达式是固定的,新的查询需求都要通过代码的修改来实现.而对于不确定的查询条件,固定查询表达式的方式显然是行不通的. 针对固定查询表达式存在的问题 ...

最新文章

  1. 全国计算机等级考试三级网络技术考试大纲
  2. 坐标系转换(镜像与对换)
  3. URL参数解析与反解析
  4. 安装和配置本地maven(三)
  5. exce中让两列数据一一对应_表格数据对比眼花缭乱、痛苦不堪,找对方法,1秒搞定...
  6. dock模拟macos教程_将macOS首选项窗格添加到您的Dock中以快速访问
  7. spring aop实例讲解_Spring框架核心知识点
  8. @Autowired和构造方法执行的顺序解析
  9. C语言 strlen函数实现
  10. 文本以大写字母html,如何强制EditText以大写字母开始文本?
  11. 鸿蒙app迁移,余承东宣布:明年3月P40首发鸿蒙系统!主流App将迁移鸿蒙
  12. 剑指Offer值字符串的排列
  13. vue项目下,webpack.js/package.json配置
  14. 支持向量机SVM原理(参数解读和python脚本)
  15. go reflect详解
  16. 2022年5月8日 解决手机连接电脑无法选择“传输文件”
  17. 四大主流浏览器内核(Trident、Gecko、Presto、Webkit)
  18. 使用Enounce MySpeed对flv加速播放
  19. Android通讯录模糊匹配搜索实现(号码、首字母,移动应用开发课程设计心得
  20. 比尔盖茨 1974 年简历曝光

热门文章

  1. 摇一摇根据城市位置推荐酒店
  2. python库numpy的reshape的终极解释
  3. DEV ComBoxEdit实现模糊检索数据
  4. Tech.Ed 2011微软技术大会(二)之专题讲座
  5. Q83:怎么画多个PLY文件组合的图形[Multiple-Mesh Objects]
  6. 问题五十:怎么用ray tracing画blobs
  7. Java学习笔记基础(中)
  8. 大屏数据可视化设计注意事项
  9. 5G大数据技术防控新型肺炎疫情
  10. 数据分析数据挖掘(四)