WPF TreeView的使用
WPF提供了treeView控件,利用该控件开发者可以将数据分层显示在树结构中。当然其中需要用到Binding的机制,有用的类包括:ObjectDataProvider、DataTemplate、HierarchicalDataTemplate、ItemsSource等等。
您可以用声明的方式解释 WPF 应如何通过分层数据模板呈现分层数据。利用 HierarchicalDataTemplate 类这一工具可以弥补复杂数据结构与该数据的直观表示之间的缺口。它与常用 DataTemplate 非常相似,但还允许您指定数据对象子项的来源。您还可以为 HierarchicalDataTemplate 提供一个用于呈现这些子项的模板。
public class Customer {public string Name { get; set; }public List<Order> Orders { get; set; }public override string ToString(){return this.Name;} }public class Order {public string Desc { get; set; }public List<OrderDetail> OrderDetails { get; set; }public override string ToString(){return this.Desc;} }public class OrderDetail {public string Product { get; set; }public int Quantity { get; set; } }
假定您现在要在一个 TreeView 控件中显示上面代码中展现的数据。该 TreeView 控件看上去可能有些类似于图 1。实现此控件需要使用两个 HierarchicalDataTemplate 和一个 DataTemplate。
图 1 在 TreeView 中显示整个数据层次结构
这两个分层模板可显示 Customer 对象和 Order 对象。由于 OrderDetail 对象没有任何子项,您可以通过非分层 DataTemplate 呈现这些对象。TreeView 的 ItemTemplate 属性会将该模板用于 Customer 类型的对象,因为 Customer 是包含在 TreeView 根层级下的数据对象。下列代码中所列的 XAML 表明了如何将所有这些方式有机地结合在一起。
<Grid><Grid.DataContext><!-- This sets the DataContext of the UIto a Customers returned by callingthe static CreateCustomers method. --><ObjectDataProvider xmlns:local="clr-namespace:VariousBindingExamples"ObjectType="{x:Type local:Customer}"MethodName="CreateCustomers"/></Grid.DataContext><Grid.Resources><!-- ORDER DETAIL TEMPLATE --><DataTemplate x:Key="OrderDetailTemplate"><TextBlock><Run>Product:</Run><TextBlock Text="{Binding Path=Product}" /><Run>(</Run><TextBlock Text="{Binding Path=Quantity}" /><Run>)</Run></TextBlock></DataTemplate><!-- ORDER TEMPLATE --><HierarchicalDataTemplate x:Key="OrderTemplate"ItemsSource="{Binding Path=OrderDetails}"ItemTemplate="{StaticResource OrderDetailTemplate}"><TextBlock Text="{Binding Path=Desc}" /></HierarchicalDataTemplate><!-- CUSTOMER TEMPLATE --><HierarchicalDataTemplate x:Key="CustomerTemplate"ItemsSource="{Binding Path=Orders}"ItemTemplate="{StaticResource OrderTemplate}"><TextBlock Text="{Binding Path=Name}" /></HierarchicalDataTemplate></Grid.Resources><TreeViewItemsSource="{Binding Path=.}"ItemTemplate="{StaticResource CustomerTemplate}"/> </Grid>
我为 Grid(包含 TreeView )的 DataContext 分配了一个 Customer 对象集合。这在 XAML 中通过使用 ObjectDataProvider 即可实现,它是从 XAML 调用方法的一种便捷方式。由于 DataContext 是在元素树中自上而下地继承,因此 TreeView 的 DataContext 会引用这组 Customer 对象。这就是我们可以为其 ItemsSource 属性提供一个 "{Binding Path=.}" 绑定的原因,通过这种方式可以表明 ItemsSource 属性被绑定到 TreeView 的 DataContext。
如果没有分配 TreeView 的 ItemTemplate 属性,则 TreeView 将仅显示顶层的 Customer 对象。由于 WPF 不知道如何呈现 Customer,因此它会对每个 Customer 都调用 ToString,并为每项都显示该文本。它无法确定每个 Customer 都有一个与其关联的 Order 对象列表,且每个 Order 都有一个 OrderDetail 对象列表。由于 WPF 无法理解您的数据架构,因此您必须向 WPF 解释架构,使它能正确呈现数据结构。
向 WPF 解释数据的结构和外观是 HierarchicalDataTemplates 的份内工作。此演示中所使用的模板包含的可视元素树非常简单,就是其中带有少量文本的 TextBlocks。在更复杂的应用程序中,模板可能包含交互式的旋转 3D 模型、图像、矢量绘图、复杂的 UserControl 或任何其他可视化基础数据对象的 WPF 内容。
需要特别注意声明模板的顺序。必须先声明一个模板后才能通过 StaticResource 扩展对其进行引用。这是由 XAML 阅读器规定的要求,该要求适用于所有资源,而不仅仅是模板。
或者可通过使用 DynamicResource 扩展来引用模板,在这种情况下,模板声明的词汇顺序无关紧要。但使用 DynamicResource 引用(而不是 StaticResource 引用)总会带来一些运行时开销,因为它们要监控资源系统的更改。由于我们不会在运行时替换模板,因此这笔开销是多余的,最好使用 StaticResource 引用并恰当地安排模板声明的顺序。
ObjectDataProvider:
ObjectDataProvider提供了绑定任意.net类型的功能,具体功能如下:
- ObjectDataProvider提供了绑定任意CLR类型的公嫩那个。
- 它可以再XAML中利用生命史的语言以及参数化的构造函数完成对数据的创建
- 增加对成员函数的绑定
- 提供了更多的异步绑定的功能
下面使用代码方式声明ObjectDataProvider:
1、加法类和方法
class Calculator{//加法public string Add(string arg1, string arg2){double x = 0;double y = 0;double z = 0;if (double.TryParse(arg1, out x) && double.TryParse(arg2, out y)){z = x + y;return z.ToString();}else{return "Input Error!";}}}
2、调用时如此书写
ObjectDataProvider odp = new ObjectDataProvider(); //指定使用的类 odp.ObjectInstance = new Calculator(); //指定使用的方法 odp.MethodName = "Add"; //方法参数应该按顺序添加 odp.MethodParameters.Add("100"); odp.MethodParameters.Add("200"); //odp.Data.ToString() 获得方法返回值 MessageBox.Show(odp.Data.ToString());
参考地址:http://msdn.microsoft.com/zh-cn/magazine/cc700358.aspx#id0190082
转载于:https://www.cnblogs.com/smallerpig/p/3646218.html
WPF TreeView的使用相关推荐
- WPF TreeView HierarchicalDataTemplate
原文 WPF TreeView HierarchicalDataTemplate <StackPanel Margin="0,0,0,0"><StackPan ...
- WPF TreeView 绑定(demo 转)
WPF TreeView 绑定 2018年01月23日 13:55:32 余生余我 阅读数:563 前台: <TreeView x:Name="tree" ItemsSour ...
- 在WPF TreeView中使用复选框
目录 介绍 背景 细节决定成败 功能要求 将Smarts放入ViewModel 树视图配置 将TreeViewItem变成ToggleButton Aero主题中的复选框错误 介绍 本文回顾了一个WP ...
- 使用ViewModel模式简化WPF TreeView
目录 介绍 TreeView的背景 ViewModel的背景 究竟是什么让TreeView如此困难? ViewModel来救援 演示解决方案 演示 1 – 带有文本搜索的家谱 PersonViewMo ...
- WPF TreeView ItemContainerStyle和ItemTemplate ViewModel Binding IsSelected
WPF TreeView ItemContainerStyle和ItemTemplate ViewModel Binding IsSelected 记录一下 直接上代码 记录一下 直接上代码 < ...
- wpf展开树节点_【转】WPF TreeView如何展开到某个节点
初用WPF的TreeView控件,需要将树展开到某个特定的TreeViewItem,各种方法都尝试过,却发现代码总在某些情况下出错,然后仔细研究,才发现其中的曲折. 解决问题的思路是,得到从树的根节点 ...
- WPF Treeview第三层横向排列
WPF 第三级横向排列效果,左侧使用WrapPanel,右侧使用StackPanel,效果见下图: 代码如下: Mainwindow的xaml如下: <Window x:Class=" ...
- WPF TreeView 相关技巧
WPF 中的 TreeView 相关实用技巧如下 响应 TreeViewItem 的双击事件 这是一个较怪异的问题,如果在 TreeView 的 MouseDoubleClick 中去处理 Selec ...
- WPF TreeView 启动时如何默认选择首个节点
问题描述:TreeView控件不具有SelecedItem 和 SelectedIndex 属性,其内部元素的选中特性由TreeViewItem 的 IsSeleced 属性控制.默认情况下启动时,T ...
最新文章
- linux路由信息自动丢失,浅谈用expect实现路由器自动备份数据
- 隐马尔可夫(HMM)
- 关于数据存储的那些事1
- Sail(CodeForces - 298B )
- JAVA中GridBagLayout布局管理器应用详解
- 论文笔记--网络新闻图像中人脸标注技术的研究-2011
- 阶段3 2.Spring_03.Spring的 IOC 和 DI_11 set方法注入
- XP框架开启debug模式_推荐一个兼容性强完美支持XP框架的安卓模拟器,一直在用!...
- html代码学习离线文档,新手学HTML代码的简易方法
- 【马尔科夫链-蒙特卡罗】马尔科夫链-蒙特卡罗方法对先验分布进行抽样
- USB打印服务器作用,沁恒股份USB打印机服务器方案概述
- 烧脑难题:诡异的世界9大悖论
- android刷新时的圆形动画_Android 实现倒计时动画效果
- 常用的一些伺服电机参数
- 对接京东jingdong.homefw.task.bookOndoor(预约/派件)接口的需求和Java代码实现
- 关于zigbee的一些术语
- mysql 怎么存经纬度_mysql存储地图经纬度的表怎么设计?
- 联想拯救者R7000(自带windows)安装ubuntu20.04,解决GTX1650驱动问题
- 快速傅里叶c51语言程序,快速傅里叶变换及其C程序
- PT100电阻分度表
热门文章
- SylixOS网络协议栈---Lwip协议栈之ARP表
- php for循环建数据
- ti processor sdk linux am335x evm /bin/setup-minicom.sh hacking
- 面向对象和面向过程思想 oc
- 《编程之美》3.6判断链表是否相交之扩展:链表找环方法证明
- 批处理处理当前文件路径的写法
- TypeError: tensor is not a torch image.
- anaconda 创建,激活,退出,删除环境
- django动态HTML转PDF方法
- ansible基本模块-server