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。
.gif)
图 1 在 TreeView 中显示整个数据层次结构
这两个分层模板可显示 Customer 对象和 Order 对象。由于 OrderDetail 对象没有任何子项,您可以通过非分层 DataTemplate 呈现这些对象。TreeView 的 ItemTemplate 属性会将该模板用于 Customer 类型的对象,因为 Customer 是包含在 TreeView 根层级下的数据对象。下列代码中所列的 XAML 表明了如何将所有这些方式有机地结合在一起。
<Grid>
<Grid.DataContext>
<!--
This sets the DataContext of the UI
to a Customers returned by calling
the 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> <TreeView
ItemsSource="{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 = ;
double y = ;
double z = ;
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("");
odp.MethodParameters.Add("");
//odp.Data.ToString() 获得方法返回值
MessageBox.Show(odp.Data.ToString());
参考地址:http://msdn.microsoft.com/zh-cn/magazine/cc700358.aspx#id0190082
WPF TreeView的使用的更多相关文章
- WPF TreeView SelectedItemChanged called twice
How to avoid WPF TreeView SelectedItemChanged being called twice Very often, we need to execute some ...
- WPF TreeView HierarchicalDataTemplate
原文 WPF TreeView HierarchicalDataTemplate HierarchicalDataTemplate 的DataType是本层的绑定,而ItemsSource是绑定下层的 ...
- WPF TreeView Indent 减少节点的缩进
www.swack.cn - 原文链接:WPF TreeView Indent 减少节点的缩进 问题 最近一个需求,需要在界面中实现Windows资源管理器TreeView的界面.但是我发现,我做出的 ...
- WPF TreeView 虚拟化-设置滚动到选中项
前言 列表滚动到具体的数据项? ListBox提供了简易快捷的滚动定位函数ScrollIntoView. TreeView树状结构列表,则没有此类方法,无法与ListBox一样,直接设置滚动到具体的数 ...
- 【原创】WPF TreeView带连接线样式的优化(WinFrom风格)
一.前言 之前查找WPF相关资料的时候,发现国外网站有一个TreeView控件的样式,是WinFrom风格的,样式如下,文章链接:https://www.codeproject.com/tips/67 ...
- wpf TreeView
<Window x:Class="WpfTutorialSamples.TreeView_control.TreeViewDataBindingSample" ...
- WPF TreeView绑定字典集合
<TreeView Name="Tree" HorizontalAlignment="Left" Height="269" Width ...
- WPF—TreeView无限极绑定集合形成树结构
1.如图所示:绑定树效果图 2.前台Xaml代码: <Window x:Class="WpfTest.MainWindow" xmlns="http://schem ...
- WPF treeview扩展
记录一下工作中遇到的问题,以便以后忘记了可以来看. 在工作中遇到一个问题,就是要实现类型如下的界面,没有使用Telerik和Dev库.本来最开始是想使用Datagrid,但不知道怎么实现treevie ...
随机推荐
- JS 命名冲突
1. JS中全局变量和局部变量重名会导致在指定域内无法取到变量: 2. 取出的结果为undefined;
- nodejs学习笔记<三>关于路由(url)
在网站开发中,路由的设置非常关键.nodejs对路由处理封装了一个比较全面的模块. 来认识下url模块 1)在命令行(cmd)可以直接 node —> url 可直接查看url模块的所有方法. ...
- hdu4588Count The Carries
链接 去年南京邀请赛的水题,当时找规律过的,看它长得很像数位dp,试了试用数位dp能不能过,d出每位上有多少个1,然后TLE了..然后用规律优化了前4位,勉强过了. 附数位dp代码及找规律代码. #i ...
- maven之详解继承与聚合
说到聚合与继承我们都很熟悉,maven同样也具备这样的设计原则,下面我们来看一下Maven的pom如何进行聚合与继承的配置实现. 一.为什么要聚合? 随着技术的飞速发展和各类用户对软件的要求越来越高, ...
- Android activity之间传值关键性代码
从当前activity中获取et 表单中的值,并跳转到myactivity.java所绑定的xml布局文件上. private EditText et; Intent intent=new Inten ...
- 查看package编译时的错误信息及重新编译
开发时,一般都是使用PL/SQL工具进行开发,查看编译错误及重新编译都很简单,但是一般的生产环境是不允许连接外界工具的,只能在命令行中进行重新编译及查看,今天我就遇到了这个问题,现在总结如下: 1.获 ...
- ps aux和ps ef的区别
ps aux 是以BSD方式显示ps -ef 是以System V方式显示,该种方式比BSD方式显示的多一重要项--(具体哪项忘了 -_- ) ps aux的输出: USER PID %CPU %ME ...
- DOS中文乱码解决
在中文Windows系统中,如果一个文本文件是UTF-8编码的,那么在CMD.exe命令行窗口(所谓的DOS窗口)中不能正确显示文件中的内容.在默认情况下,命令行窗口中使用的代码页是中文或者美国的,即 ...
- C#_Winfrom下的中英文翻译
Winform下的语言国际化,几行代码轻松实现 最近做了一些关于winform的项目,需要用到winform的语言国际化,在初使化的时候用起来非常方便.可以参考一下: 核心逻辑: 预览效果演示: ...
- Java 默认/缺省 server 还是 client 模式
不多说,复制官方文档,适用于 Java 5 6 7 Architecture OS Default client VM if server-class, server VM; otherwise, c ...