学习WPF: 创建数据绑定目录树
第一步,当然是定义要绑定的数据类型了.
在目录树这个例子中,每个TreeViewItem要显示的数据可以用System.IO.DirectoryInfo来表示,但是这样做有一个麻烦:DirectoryInfo只能通过GetDirectories()方法来获取子目录,但是WPF里的数据绑定则更倾向于使用属性在数据间导航,所以为了更方便地使用数据绑定,我们最好还是自定义一个类来完成这样的工作:
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.IO;
namespace WpfApplication1
{
class BindDirectoryList : List<BindDirectory>
{
public BindDirectoryList()
{
foreach (var drive in DriveInfo.GetDrives())
{
Add(new BindDirectory(drive.RootDirectory.FullName));
}
}
}
}
这个类就更简单了,仅仅是在创建的时候加载所有的磁盘的根目录.
第三步,设计用户界面
只需要在Window中添加一个TreeView,然后修改几行代码,就能轻松地显示我们的数据了:
<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: 创建数据绑定目录树相关推荐
- 表达式目录树(Expression)
表达式目录树 什么是表达式目录树呢?用于表示Lambda表达式逻辑的一种数据结构,表达式树也可以称作表达式目录树,它 将代码表示成一个对象树,而不是可执行的代码.这个跟汇编原理一样,我们找到关键字,把 ...
- 看很多人要求目录树,我的代码可以满足大多数要求 作 者: flyxxxxx (灭神)
<script language="javascript" type="text/javascript"> document.title=" ...
- C#表达式目录树系列之1 -- 表达式目录树基本概念
概要 本文主要是帮助读者搞清楚什么是表达式目录树,表达书目录树能做什么,如何创建表达式目录树.后续几篇文章侧重于表达式目录树的具体应用. 表达式目录树是什么 表达式目录树是一种树型结构,它将代码以数据 ...
- 《Linux C编程环境》 课程大实验 及近期练习题:计算器,复写机,目录树创建,批处理执行器,扫雷
<Linux C编程环境> 课程大实验 及近期练习题:计算器,复写机,目录树创建,批处理执行器,扫雷 之前作业的题了,征求了老师的意见,同意我把个人解析放开公布,再提交作业已经无效了. ...
- Python语言学习:创建/删除文件/文件夹、获取当前文件/文件夹路径(系统环境路径/目录)、获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略
Python语言学习:创建/删除文件/文件夹.获取当前文件/文件夹路径(系统环境路径/目录).获取当前文件夹下的所有子文件路径等代码(os系列用法)实现之详细攻略 目录 系统环境路径的设置 1.sys ...
- bat文件打开一闪就没了_window文件夹目录树的创建
问题描述 当我们的项目文件夹逐渐丰满,各类文件种类繁多,为了增强项目资料的自明性,便于资料管理和交接,有必要对项目文件进行汇总说明. 要进行文件汇总,首先要提取文件的目录树. 什么是目录树呢?在cmd ...
- python递归创建目录_Python学习第172课——Linux中一次性创建多层目录以及递归列出所有子目录...
我们现在是学习Linux,Linux是服务器.云计算方面的东西,我要把这些东西都掌握,我们现在要开始去学,那我们现在在桌面专门建一个文件夹,名字叫做Linux,这个文件夹用来保存我们专门去学习的东西. ...
- C#学习基本概念---xcopy(复制文件和目录树)
XCOPY是COPY的扩展,可以把指定的目录连文件和目录结构一并拷贝,但不能拷贝系统文件:使用时源盘符.源目标路径名.源文件名至少指定一个:选用/S时对源目录下及其子目录下的所有文件进行COPY.除非 ...
- C#表达式目录树系列之5 –动态创建查询表达式
概要 在项目开发中,根据用户的需求,一般来是,我们的查询表达式是固定的,新的查询需求都要通过代码的修改来实现.而对于不确定的查询条件,固定查询表达式的方式显然是行不通的. 针对固定查询表达式存在的问题 ...
最新文章
- 全国计算机等级考试三级网络技术考试大纲
- 坐标系转换(镜像与对换)
- URL参数解析与反解析
- 安装和配置本地maven(三)
- exce中让两列数据一一对应_表格数据对比眼花缭乱、痛苦不堪,找对方法,1秒搞定...
- dock模拟macos教程_将macOS首选项窗格添加到您的Dock中以快速访问
- spring aop实例讲解_Spring框架核心知识点
- @Autowired和构造方法执行的顺序解析
- C语言 strlen函数实现
- 文本以大写字母html,如何强制EditText以大写字母开始文本?
- 鸿蒙app迁移,余承东宣布:明年3月P40首发鸿蒙系统!主流App将迁移鸿蒙
- 剑指Offer值字符串的排列
- vue项目下,webpack.js/package.json配置
- 支持向量机SVM原理(参数解读和python脚本)
- go reflect详解
- 2022年5月8日 解决手机连接电脑无法选择“传输文件”
- 四大主流浏览器内核(Trident、Gecko、Presto、Webkit)
- 使用Enounce MySpeed对flv加速播放
- Android通讯录模糊匹配搜索实现(号码、首字母,移动应用开发课程设计心得
- 比尔盖茨 1974 年简历曝光