HierarchicalDataTemplate顾名思义,分层数据模板,就是用来定义分层数据样式的模板,一般多用于MenuItem和TreeViewItem

包含几个重要属性

DataType指定模板用于哪种数据类型

ItemsSource指定该类数据的子集,即下一层显示那些数据

内容 指定数据如何显示 绑定哪个属性

MSDN上的一个例子:

1.定义数据集
public class League
{
public League(string name)
{
_name = name;
_divisions = new List<Division>();
}
string _name;
public string Name { get { return _name; } }
List<Division> _divisions;
public List<Division> Divisions { get { return _divisions; } }
}
public class Division
{
public Division(string name)
{
_name = name;
_teams = new List<Team>();
}
string _name;
public string Name { get { return _name; } }
List<Team> _teams;
public List<Team> Teams { get { return _teams; } }
}
public class Team
{
public Team(string name)
{
_name = name;
}
string _name;
public string Name { get { return _name; } }
}
public class ListLeagueList : List<League>
{
public ListLeagueList()
{
League l;
Division d;
Add(l = new League("League A"));
l.Divisions.Add((d = new Division("Division A")));
d.Teams.Add(new Team("Team I"));
d.Teams.Add(new Team("Team II"));
d.Teams.Add(new Team("Team III"));
d.Teams.Add(new Team("Team IV"));
d.Teams.Add(new Team("Team V"));
l.Divisions.Add((d = new Division("Division B")));
d.Teams.Add(new Team("Team Blue"));
d.Teams.Add(new Team("Team Red"));
d.Teams.Add(new Team("Team Yellow"));
d.Teams.Add(new Team("Team Green"));
d.Teams.Add(new Team("Team Orange"));
l.Divisions.Add((d = new Division("Division C")));
d.Teams.Add(new Team("Team East"));
d.Teams.Add(new Team("Team West"));
d.Teams.Add(new Team("Team North"));
d.Teams.Add(new Team("Team South"));
Add(l = new League("League B"));
l.Divisions.Add((d = new Division("Division A")));
d.Teams.Add(new Team("Team 1"));
d.Teams.Add(new Team("Team 2"));
d.Teams.Add(new Team("Team 3"));
d.Teams.Add(new Team("Team 4"));
d.Teams.Add(new Team("Team 5"));
l.Divisions.Add((d = new Division("Division B")));
d.Teams.Add(new Team("Team Diamond"));
d.Teams.Add(new Team("Team Heart"));
d.Teams.Add(new Team("Team Club"));
d.Teams.Add(new Team("Team Spade"));
l.Divisions.Add((d = new Division("Division C")));
d.Teams.Add(new Team("Team Alpha"));
d.Teams.Add(new Team("Team Beta"));
d.Teams.Add(new Team("Team Gamma"));
d.Teams.Add(new Team("Team Delta"));
d.Teams.Add(new Team("Team Epsilon"));
}
public League this[string name]
{
get
{
foreach (League l in this)
if (l.Name == name)
return l;
return null;
}
}
}

窗体:

<!--<SnippetHDT>-->
<Window x:Class="SDKSample.Window1"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
Title="HierarchicalDataTemplate Sample"
xmlns:src="clr-namespace:SDKSample">
<DockPanel>
<DockPanel.Resources>
<src:ListLeagueList x:Key="MyList"/>
<HierarchicalDataTemplate DataType    = "{x:Type src:League}"
ItemsSource = "{Binding Path=Divisions}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType    = "{x:Type src:Division}"
ItemsSource = "{Binding Path=Teams}">
<TextBlock Text="{Binding Path=Name}"/>
</HierarchicalDataTemplate>
<DataTemplate DataType="{x:Type src:Team}">
<TextBlock Text="{Binding Path=Name}"/>
</DataTemplate>
</DockPanel.Resources>
<Menu Name="menu1" DockPanel.Dock="Top" Margin="10,10,10,10">
<MenuItem Header="My Soccer Leagues"
ItemsSource="{Binding Source={StaticResource MyList}}" />
</Menu>
<TreeView>
<TreeViewItem ItemsSource="{Binding Source={StaticResource MyList}}" Header="My Soccer Leagues" />
</TreeView>
</DockPanel>
</Window>

这个例子的数据源是一个分层的List对象,下面一个例子的数据源是一个XML文件,大体相同,不同的地方是需要先实例化一个XmlDataProvider用来获取XML的内容,绑定的时候用的不是Path,而是XPath属性,给控件绑定属性的时候属性名加@(加@的是属性Attribute 不加的是子级元素)

<?xml version="1.0" encoding="utf-8" ?>
<Data xmlns="">
<Grade Name="初一">
<Class Name="1班">
<Group Name="1-1-1组"></Group>
<Group Name="1-1-2组"></Group>
<Group Name="1-1-3组"></Group>
</Class>
<Class Name="2班">
<Group Name="1-2-1组"></Group>
<Group Name="1-2-2组"></Group>
<Group Name="1-2-3组"></Group>
</Class>
<Class Name="3班">
<Group Name="1-3-1组"></Group>
<Group Name="1-3-2组"></Group>
<Group Name="1-3-3组"></Group>
</Class>
</Grade>
<Grade Name="初二">
<Class Name="21班">
<Group Name="2-1-1组"></Group>
<Group Name="2-1-2组"></Group>
<Group Name="2-1-3组"></Group>
</Class>
<Class Name="22班">
<Group Name="2-2-1组"></Group>
<Group Name="2-2-2组"></Group>
<Group Name="2-2-3组"></Group>
</Class>
<Class Name="23班">
<Group Name="2-3-1组"></Group>
<Group Name="2-3-2组"></Group>
<Group Name="2-3-3组"></Group>
</Class>
</Grade>
<Grade Name="初三">
<Class Name="31班">
<Group Name="3-1-1组"></Group>
<Group Name="3-1-2组"></Group>
<Group Name="3-1-3组"></Group>
</Class>
<Class Name="32班">
<Group Name="3-2-1组"></Group>
<Group Name="3-2-2组"></Group>
<Group Name="3-2-3组"></Group>
</Class>
<Class Name="33班">
<Group Name="3-3-1组"></Group>
<Group Name="3-3-2组"></Group>
<Group Name="3-3-3组"></Group>
</Class>
</Grade>
</Data>
<XmlDataProvider x:Key="Data2" Source="Data.xml" XPath="Data/Grade"/>
<HierarchicalDataTemplate DataType="Grade" ItemsSource="{Binding XPath= Class}">
<TextBlock Text="{Binding XPath=@Name}"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="Class" ItemsSource="{Binding XPath=Group}">
<RadioButton Content="{Binding XPath=@Name}" GroupName="gr"/>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="Group" ItemsSource="{Binding XPath=Student}">
<CheckBox Content="{Binding XPath=@Name}"/>
</HierarchicalDataTemplate>
<TreeView Margin="5" ItemsSource="{Binding Source={StaticResource Data2}}"></TreeView>

也试过递归方式给TreeView添加节点

void LoadXmlToTree(XElement root,TreeViewItem item)
{
if (root != null)
{
foreach (XElement xe in root.Elements())
{
TreeViewItem item2 = new TreeViewItem();
item2.Header = xe.Attribute("Name").Value.ToString();
item.Items.Add(item2);
LoadXmlToTree(xe,item2);
}
}
}

明显不如模板使用起来方便,但是现在的理解还处于初级阶段,只是简单的套使用方法,知其然,不知其所以然,还有待更进一步的理解,毕竟真正理解透了,原理清楚了,才能更灵活的应用。

WPF之HierarchicalDataTemplate相关推荐

  1. WPF TreeView HierarchicalDataTemplate

    原文 WPF TreeView HierarchicalDataTemplate   <StackPanel Margin="0,0,0,0"><StackPan ...

  2. WPF/Silverlight HierarchicalDataTemplate 模版的使用

    上一篇 对Wpf/Silverlight Template 进行了总结,本篇继续上一篇,主要是介绍 HierarchicalDataTemplate 的使用方法.HierarchicalDataTem ...

  3. WPF/Silverlight HierarchicalDataTemplate 模版的使用(转)

    上一篇 对Wpf/Silverlight Template 进行了总结,本篇继续上一篇,主要是介绍 HierarchicalDataTemplate 的使用方法.HierarchicalDataTem ...

  4. WPF疑难问题之Treeview中HierarchicalDataTemplate多级样式

    文章目录 一.问题场景 二.解决思路 一.问题场景 日常为 TreeView 自定义样式过程中,如果涉及到树形多级样式不同时,又该如何去做?例如树形显示文件夹和文件节点. TreeView 样式如下: ...

  5. WPF中触发器Trigger、MultiTrigger、DataTrigger、MultiDataTrigger、EventTrigger几种

    WPF中有种叫做触发器的东西(记住不是数据库的trigger哦).它的主要作用是根据trigger的不同条件来自动更改外观属性,或者执行动画等操作. WPFtrigger的主要类型有:Trigger. ...

  6. 潜移默化学会WPF(难点控件treeview)--改造TreeView(CheckBox多选择版本),递归绑定数据...

    目前自己对treeview的感慨很多 今天先讲 面对这种 表结构的数据 的其中一种绑定方法,后面多几列其他属性都没关系,例如多个字段, 1  A  0 2  B  0 3  C  0 4  D  1 ...

  7. 分享Silverlight/WPF/Windows Phone一周学习导读(07月25日-07月31日)

    上周,微软发布Visual Studio LightSwitch 2011正式版,为商业应用开发人员推出一个新的应用开发产品.Visual Studio LightSwitch 2011 作为一种简单 ...

  8. WPF 自定义列表筛选 自定义TreeView模板 自定义ListBox模板

    有很多项目,都有数据筛选的操作.下面提供一个案例,给大家做参考. 左侧是数据源,搜索框加TreeView控件,右侧是ListBox控件.在左侧数据列点击添加数据,然后点击确定,得到所筛选的数据. 下面 ...

  9. WPF模板(二)应用

    原文:WPF模板(二)应用 本次内容来源于电子书,和上一篇一样. 在WPF中有三大模板ControlTemplate,ItemsPanelTemplate,DataTemplate.其中Control ...

  10. WPF Template模版之DataTemplate与ControlTemplate的关系和应用【二】

    1. DataTemplate和ControlTemplate的关系 学习过DataTemplate和ControlTemplate,你应该已经体会到,控件只是数据的行为和载体,是个抽象的概念,至于它 ...

最新文章

  1. Java多线程(九)—— interrupt()和线程终止方式
  2. 浏览是不是计算机网络功能,什么是因特网——计算机网络是怎么为你服务的?...
  3. Linux磁盘怎么备份,Linux的硬盘分区表备份与还原
  4. Jupyter不要自动启动浏览器(Firefox)
  5. redis 失效时间单位是秒还是毫秒_【redis中键的生存时间(expire) 】
  6. GIF图片合集(用于网络请求图片用)
  7. 浙江理工大学计算机组成原理试卷,浙江理工大学计算机组成原理设计试题.doc...
  8. nginx 带宽_谈谈Nginx和LVS各自的优缺点以及使用
  9. 史上最全!计算机科学领域顶会最佳论文大合集:微软研究院最多,清华排24...
  10. 判断字符串是数字、字符、还是...
  11. 三菱fx3u通讯手册_使用USR-N510实现局域网内连接FX3U
  12. 运动目标检测跟踪各过程算法综述
  13. apache 中 ServerAlias多个域名绑定同一空间(网站)
  14. 【TSP】基于matlab GUI蚁群算法求解旅行商问题【含Matlab源码 929期】
  15. 计算机无法进入增值税认证平台,增值税认证勾选平台打不开怎么办
  16. Microsoft .NET Framework 4 安装 1603错误的解决
  17. 电子表格文档控件DevExpress Office File API v21.1 - 增强PDF文档API
  18. 输入阻抗和输出阻抗的理解
  19. Android 13运行时权限变更一览
  20. 傲腾服务器系统,服务器加傲腾内存

热门文章

  1. 【路径规划】基于matlab A_star算法机器人栅格地图路径规划【含Matlab源码 116期】
  2. YOLOv5与Faster RCNN相比。 谁赢?
  3. 创建dqn的深度神经网络_深度Q网络(DQN)-I
  4. csv datatable 乱码 导出_C#将DataTable导出到csv文件
  5. 【reproject_inter】fits头文件的映射(1,改变fits文件的数据范围,2,对坐标系进行投影转换)
  6. java change方法作用_程序员必看之Java中方法的参数传递问题
  7. tracepro杂散光分析例子_第二期青年矿床学家网络论坛(刘琰碳酸岩杂岩体型稀土矿;王小林CO2成矿效应)...
  8. Firefox 将添加画中画功能
  9. 当你想对常用网站定制属于自己的颜色,然而又没人理你怎么办
  10. Objective-C基础语法快速入门