当前位置: 首页 > news >正文

WPF中TreeView控件如何获取选中的TreeViewItem对象?

WPF中TreeView控件如何获取选中的TreeViewItem对象?

WPF的TreeView控件与过去的TreeView控件完全不同,几乎是从头重写了一遍,其最重要的特点之一就是支持绑定到层次型数据。只需给其指定一个HierarchicalDataTemplate即可。非常方便。请看以下例子:

<Window.Resources>
<!--大学-->
<HierarchicalDataTemplate ItemsSource="{Binding Path=Academies}" DataType="{x:Type local:University}">
<TextBlock Text="{Binding Path=UniversityName}"></TextBlock>
</HierarchicalDataTemplate>
<!--学院-->
<HierarchicalDataTemplate ItemsSource="{Binding Path=Departments}" DataType="{x:Type local:Academy}">
<TextBlock Text="{Binding Path=AcademyName}"></TextBlock>
</HierarchicalDataTemplate>
<!--系-->
<DataTemplate DataType="{x:Type local:Department}">
<TextBlock Text="{Binding Path=DepartmentName}"/>
</DataTemplate>

</Window.Resources>

其中,大学-->学院-->系,构成一个典型的对象层次。

以下XAML代码实现绑定:

<TreeView ……>
<TreeViewItem ItemsSource="{Binding}" Header="大学列表">
</TreeViewItem>

只需给TreeView的DataContext赋一个University的对象集合,就可以自动显示:

然而,在写这个小程序时,我发现了一个问题:当TreeView绑定到数据集合后,TreeView.SelectedItem返回的不是我预想中的TreeViewItem,而就是数据对象本身(如University,Academy等)。

这虽然方便了数据对象的提取,却带来其他的麻烦,比如,我可能需要将选中的节点加上红色标记以突出显示,或者是自动展开选中节点的子树,或者访问其父节点对象,这都需要获取TreeViewItem对象。

我想了多种方法在TreeView本身的SelectedItemChanged事件中尝试取出选中节点对应的TreeViewItem对象,均无功而返。

最后的解决方法很戏剧化,其实不根本需要钻牛角尖,非要在SelectedItemChanged事件中干这事。TreeViewItem本身有一个Selected事件,其参数e中就提供了需要的TreeViewItem对象。

于是,解决方案很简单,在TreeView中响应TreeViewItem的附加事件Selected:

<TreeView Name="treeView1" TreeViewItem.Selected="treeView1_Selected" ……>
<T/reeView>

其事件代码如下:


private void treeView1_Selected(object sender, RoutedEventArgs e)
{

//e.OriginalSource就是TreeViewItem对象,你可以将其保存到窗体类的某个私有字段中,或者直接使用它,如下所示:
(e.OriginalSource as TreeViewItem).IsExpanded = true;
}

搞定!

当前正在制作给企业培训所用的WPF教学PPT,对其特性进行了较多的探索与应用,谈些感触:

WPF比原先的Windows Form灵活得多,有几个特性我实在是非常欣赏:

(1)模板(包括控件模板与数据模板)

(2)数据绑定

(3)路由事件和依赖属性

我个人认为,在Windows桌面应用领域,WPF迟早必将全面取代Windows Form。诸位.NET程序员可以提早做些准备。

相关文章:

  • 回复网友 man1231,关于业务目标界定的问题
  • 写的将skb copy/clone后转发到源地址的一段代码
  • “简单低级”的微软技术与研究生的贬值
  • 中缀表达式转后缀表达式
  • wxGlade wxFormBuilder
  • 价值驱动:移动支付的推手
  • 赖床随想记录
  • 世博会助中移动从3G迈向4G
  • 《中关村两个男人的斗争》外传——西直门
  • JavaScript 面向对象的使用
  • Symbian下自动切换SDK的批处理代码
  • [Web开发] 在线 Javascript 代码格式美化工具
  • 如果浏览器是女人……
  • C#几种常用的排序算法
  • DFS测试_引用状态持续缓存时间
  • CAP理论的例子讲解
  • ES6核心特性
  • es6要点
  • HashMap ConcurrentHashMap
  • JavaScript对象详解
  • JavaScript新鲜事·第5期
  • mac修复ab及siege安装
  • Nodejs和JavaWeb协助开发
  • Python代码面试必读 - Data Structures and Algorithms in Python
  • 基于axios的vue插件,让http请求更简单
  • 开年巨制!千人千面回放技术让你“看到”Flutter用户侧问题
  • 浅谈Kotlin实战篇之自定义View图片圆角简单应用(一)
  • 入门级的git使用指北
  • 提醒我喝水chrome插件开发指南
  • 一个6年java程序员的工作感悟,写给还在迷茫的你
  • [Shell 脚本] 备份网站文件至OSS服务(纯shell脚本无sdk) ...
  • 翻译 | The Principles of OOD 面向对象设计原则
  • 新年再起“裁员潮”,“钢铁侠”马斯克要一举裁掉SpaceX 600余名员工 ...
  • ​LeetCode解法汇总2808. 使循环数组所有元素相等的最少秒数
  • #define与typedef区别
  • #if #elif #endif
  • #图像处理
  • (003)SlickEdit Unity的补全
  • (AngularJS)Angular 控制器之间通信初探
  • (C++17) optional的使用
  • (TOJ2804)Even? Odd?
  • (第二周)效能测试
  • (二)换源+apt-get基础配置+搜狗拼音
  • (心得)获取一个数二进制序列中所有的偶数位和奇数位, 分别输出二进制序列。
  • (一)Mocha源码阅读: 项目结构及命令行启动
  • (原創) X61用戶,小心你的上蓋!! (NB) (ThinkPad) (X61)
  • .NET / MSBuild 扩展编译时什么时候用 BeforeTargets / AfterTargets 什么时候用 DependsOnTargets?
  • .net CHARTING图表控件下载地址
  • .net core 6 集成和使用 mongodb
  • .NET MVC第五章、模型绑定获取表单数据
  • .Net 垃圾回收机制原理(二)
  • .Net下使用 Geb.Video.FFMPEG 操作视频文件
  • .Net组件程序设计之线程、并发管理(一)
  • [.net] 如何在mail的加入正文显示图片
  • [<死锁专题>]