解析WPF绑定层次结构数据的应用详解
程序员文章站
2024-03-01 14:34:34
在实际项目应用中会存在多种类型的层次结构数据,wpf提供了良好的数据绑定机制。其中运用最频繁的就是listbox和treeview控件。一、listbox和treeview...
在实际项目应用中会存在多种类型的层次结构数据,wpf提供了良好的数据绑定机制。其中运用最频繁的就是listbox和treeview控件。
一、listbox和treeview控件的区别
1.listbox显示单层次数据集合,treeview可以显示单层次和多层次数据集合;
2.通过listbox在ui层面可以展示良好的数据显示效果,对数据集合可以进行排序、分组、过滤操作;
3.treeview显示为一个多层次的数据集合为树形结构,通过templete和style属性同样可以为其定义良好的数据显示效果;
二、listbox控件示例
1.listbox绑定数据进行分组:
使用listbox.gridstyle标签,定义headertemplate属性用来定义组头的外观:
复制代码 代码如下:
代码
<listbox itemsource="{binding path=data}">
<listbox.gridstyle>
<groupstyle.headertemplate>
<datatemplate>
<stackpanel>
<image source="xxx.jpg"/>
<label content="c:"/>
<stackpanel>
</datatemplate>
</groupstyle.headertemplate>
</listbox.gridstyle>
......
</listbox>
这样就可以创建出类似windows 文件管理器的效果:
2.listbox一些使用经验:
/1 如果要实现类似windows的漂亮的界面效果并进行分组,需要自定义groupstyle的样式,否则wpf会使用内建的groupstyle,也可以引用groupstyle.default静态属性。
/2 listbox只能定义一层数据结构,在listbox中的item里再次使用listbox,后listbox里的itemsource不会继承上一层listbox的item源中的数据集合,如有如下数据集合:
复制代码 代码如下:
public list<groups> groups = new list<groups>();groups.add(new group);........
复制代码 代码如下:
public class group {
public int id { get; set; }
public string name { get; set; }
private list<box> boxes = new list<box>();
public list<box> boxes {
get { return boxes; }
}
}
listbox的itemsource binding list<groups>的数据集合,其item中的listbox binding list<box>,则item中的listbox是无法获取list<box>这个数据集合的;
三、treeview控件示例
1.有如上数据集合,使用treeview绑定多层数据集合:
复制代码 代码如下:
代码
<treeview x:name="maintree" focusvisualstyle="{x:null}" itemssource="{binding groups}">
<treeview.itemcontainerstyle>
<style targettype="{x:type treeviewitem}">
<setter property="isexpanded" value="{binding isexpanded, mode=twoway}" />
<setter property="isselected" value="{binding isselected, mode=twoway}" />
<setter property="fontweight" value="normal" />
<style.triggers>
<trigger property="isselected" value="true">
<setter property="fontweight" value="bold"/>
</trigger>
</style.triggers>
</style>
</treeview.itemcontainerstyle>
<treeview.resources>
<hierarchicaldatatemplate datatype="{x:type m:groupvo}" itemssource="{binding boxes}">
<stackpanel orientation="horizontal">
<label content="{binding path=friendlyname}"></label>
<checkbox verticalalignment="center" ischecked="{binding path=isselected}"></checkbox>
</stackpanel>
</hierarchicaldatatemplate>
<datatemplate datatype="{x:type m:boxvo}">
<grid margin="0,5,5,10" mousedown="maintree_mousedown" loaded="grid_loaded">
<grid.rowdefinitions>
<rowdefinition></rowdefinition>
</grid.rowdefinitions>
<grid.columndefinitions>
<columndefinition width="*"></columndefinition>
<columndefinition width="6*"></columndefinition>
</grid.columndefinitions>
<image source="/resources/images/shgbit.png" width="50" verticalalignment="top" grid.column="0" grid.row="0"></image>
<label grid.rowspan="2" grid.row="0" grid.column="0" margin="5,5,0,0" content="{binding path=friendlyname}"></label>
</datatemplate>
</treeview.resources>
</treeview>
hierarchicaldatatemplate属性为层级数据模板,它继承数据集合的层级结构,要表示树的层级依赖关系必须使用hierarchicaldatatemplate。
属性绑定数据使用twoway是为双向属性,当源数据或目标被改变是更新另一方的数据。在层次树表示中的典型应用就是:用checkbox进行子节点的选中和未选中的状态传递。
推荐阅读
-
解析WPF绑定层次结构数据的应用详解
-
JavaScript数据结构中栈的应用之表达式求值问题详解
-
解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
-
C#中WPF ListView绑定数据的实例详解
-
解析从源码分析常见的基于Array的数据结构动态扩容机制的详解
-
C#中WPF ListView绑定数据的实例详解
-
JavaScript队列的应用实例详解【经典数据结构】
-
【数据结构】【树及算法】二叉树的实现,树的应用:表达式解析,树的遍历,优先队列和二叉堆
-
数据结构-树与二叉树-二叉树的层次遍历(UVA - 122 Trees on the level)以及函数sscanf strchr的介绍与应用
-
JavaScript队列的应用实例详解【经典数据结构】