MVVM绑定多层级数据到TreeView并设置项目展开
时间:2022-06-09
本文章向大家介绍MVVM绑定多层级数据到TreeView并设置项目展开,主要内容包括其使用实例、应用技巧、基本知识点总结和需要注意事项,具有一定的参考价值,需要的朋友可以参考一下。
昨天在做项目的时候碰到了这个问题,发现通常我们定义的数据不法绑定到控件上,接下来我将讲一下我是怎么解决这个问题的。
要用MVVM模式在程序中将层级数据绑定到TreeView上,通常我们定义的数据是形如文件夹和文件的结构,如:
folder-
file1
folder1-
file2
folder2-
这样的数据,我们一般定义的类如下
1 public class Folder
2 {
3 public string Name{set;get;}
4 public IList<Folder> Folders{set;get;}
5 public IList<File> Files{set;get;}
6 }
7
8 public class File
9 {
10 public string Name{set;get;}
11 }
而在XAML中直接用两个DataType类型为Folder和File的HierarchicalDataTemplate表示Folders和Files,这样显示出来的数据不能完整按照我们的意图的显示出来。显示结果为
folder-
folder1
结果只显示了文件Folder信息。
怎么解决这个问题呢?
1 public IList<object> Items
2 {
3 get{
4 IList<object> items = new List<object>();
5 foreach(var fo in this.Folders)
6 items.Add(fo);
7 foreach(var f in this.Files)
8 items.Add(f);
9 return items;
10 }
11 }
我们在Folder类中定义这个Items属性,接下来就是XAML部分
1 <HierarchicalDataTemplate DataType="{x:Type Model:Folder}" ItemsSource="{Binding Items}">
2 <TextBlock Text="{Binding Name}" />
3 </HierarchicalDataTemplate>
4 <DataTemplate DataType="{x:Type Model:File}">
5 <TextBlock Text="{Binding Name}" />
6 </DataTemplate>
这样就完美的解决了这个问题,看来多层级数据,XAML中只能解析为单属性递归。
数据绑定做完后,我还想在一开始加载就屏开TreeView中的所有项,其实这个只需要设置一下ItemContainerStyle的Style就可以了,如下
<TreeView.ItemContainerStyle>
<Style TargetType="{x:Type TreeViewItem}">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
大家还有更好的办法绑定多层级数据吗?
- php环境无法上传文件的解决方法
- Java魔法堂:JUnit4使用详解
- Windows魔法堂:解决“由于启动计算机时出现页面文件配置问题.......”
- Java魔法堂:自定义和解析注解
- 【Hibernate那点事儿】—— Hibernate应该了解的知识
- 【Hibernate那点事儿】—— Hibernate应该了解的知识
- Java魔法堂:以Windows服务的形式运行Java程序
- 【Hibernate那点事儿】—— Hibernate知识总结
- java获取网页源代码
- Java魔法堂:注解用法详解——@SuppressWarnings
- 日志那点事儿——slf4j源码剖析
- 给Dreamweaver插上Svn的翅膀
- MyBatis魔法堂:ResultMap详解
- 腾讯海量监控体系经验分享
- JavaScript 教程
- JavaScript 编辑工具
- JavaScript 与HTML
- JavaScript 与Java
- JavaScript 数据结构
- JavaScript 基本数据类型
- JavaScript 特殊数据类型
- JavaScript 运算符
- JavaScript typeof 运算符
- JavaScript 表达式
- JavaScript 类型转换
- JavaScript 基本语法
- JavaScript 注释
- Javascript 基本处理流程
- Javascript 选择结构
- Javascript if 语句
- Javascript if 语句的嵌套
- Javascript switch 语句
- Javascript 循环结构
- Javascript 循环结构实例
- Javascript 跳转语句
- Javascript 控制语句总结
- Javascript 函数介绍
- Javascript 函数的定义
- Javascript 函数调用
- Javascript 几种特殊的函数
- JavaScript 内置函数简介
- Javascript eval() 函数
- Javascript isFinite() 函数
- Javascript isNaN() 函数
- parseInt() 与 parseFloat()
- escape() 与 unescape()
- Javascript 字符串介绍
- Javascript length属性
- javascript 字符串函数
- Javascript 日期对象简介
- Javascript 日期对象用途
- Date 对象属性和方法
- Javascript 数组是什么
- Javascript 创建数组
- Javascript 数组赋值与取值
- Javascript 数组属性和方法
- R语言中的模拟过程和离散化:泊松过程和维纳过程
- R语言Lee-Carter模型对年死亡率建模预测预期寿命
- R语言有极值(EVT)依赖结构的马尔可夫链(MC)对洪水极值分析
- RxSwift 封装 CoreBluetooth(一) 配置
- Golang 操作Excel文件
- 腾讯云TKE-搭建prometheus监控(一)
- Android开发中ProgressDialog简单用法示例
- Android实现拍照及图片裁剪(6.0以上权限处理及7.0以上文件管理)
- Android仿微信调用第三方地图应用导航(高德、百度、腾讯)
- Android数据共享 sharedPreferences 的使用方法
- Android NavigationBar问题处理的方法
- mac系统下载、安装、使用Java8教程
- React Native学习之Android的返回键BackAndroid详解
- Android动态添加view的方法示例
- Android开发之瀑布流控件的实现与使用方法示例