WPF疑难问题之Treeview中HierarchicalDataTemplate多级样式
文章目录
- 一、问题场景
- 二、解决思路
一、问题场景
日常为 TreeView
自定义样式过程中,如果涉及到树形多级样式不同时,又该如何去做?例如树形显示文件夹和文件节点。
TreeView
样式如下:
<HierarchicalDataTemplate x:Key="Folder" DataType="{x:Type local:TreeItemViewModel}" ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}"/><TextBlock Text="/"/><TextBlock Text="{Binding TreeType}"/></StackPanel>
</HierarchicalDataTemplate><HierarchicalDataTemplate x:Key="Node" DataType="{x:Type local:TreeItemViewModel}"ItemsSource="{Binding Children}"><TextBlock Text="{Binding Name}"/>
</HierarchicalDataTemplate><TreeView ItemTemplate="{DynamicResource Folder}" x:Name="treeview" Width="200" DataContext="{StaticResource TreeViewModel}"local:TreeViewAttach.SelectItem="{Binding SeletedItem,Mode=TwoWay}" local:TreeViewAttach.SelectedMonitored="True" ItemsSource="{Binding Path=TreeItems}" VirtualizingPanel.IsVirtualizing="True" VirtualizingPanel.IsVirtualizingWhenGrouping="True">
</TreeView>
TreeViewModel
内容如下:
public class TreeViewModel:Prism.Mvvm.BindableBase{private List<TreeItemViewModel> treeItems;public TreeViewModel(){for (int i = 0; i < 10; i++){TreeItemViewModel item = new TreeItemViewModel{Name = $"test{i}",};for (int j = 0; j < 10; j++){TreeItemViewModel item01 = new TreeItemViewModel{Name = $"孩子-{i}",};var child = new TreeItemViewModel { Name = $"c{i}-{j}" };for (int m = 0; m < 10; m++){var childsub = new TreeItemViewModel { Name = $"{child.Name}-{m}" };child.Children.Add(childsub);}item.Children.Add(item01);item.Children.Add(child);}TreeItems.Add(item);}}public List<TreeItemViewModel> TreeItems{get {if (treeItems == null){treeItems = new List<TreeItemViewModel>();}return treeItems;}set => SetProperty(ref treeItems, value);}
}
子项TreeViewItemModel
内容如下:
public class TreeItemViewModel : Prism.Mvvm.BindableBase{private string name;public string Name{get => name;set => SetProperty(ref name, value);}private List<TreeItemViewModel> children;public List<TreeItemViewModel> Children{get {if (children == null){children = new List<TreeItemViewModel>();}return children;}set => SetProperty(ref children, value);}public TreeType TreeType { get {if (children != null && children.Count > 0){return TreeType.Folder;}return TreeType.Node;} }
}
运行效果如下:
可以看到,所有的样式都是使用的 Key="Folder"
的样式模板。
二、解决思路
如果希望多个样式都应用到 TreeView
中时,需要考虑是否能够给 HierarchicalDataTemplate
本身添加额外的样式。查看 HierarchicalDataTemplate
内部代码:
public class HierarchicalDataTemplate : DataTemplate
{public int AlternationCount{}public BindingGroup ItemBindingGroup{}public Style ItemContainerStyle{}public StyleSelector ItemContainerStyleSelector{}public BindingBase ItemsSource{}public string ItemStringFormat{}public DataTemplate ItemTemplate{}public DataTemplateSelector ItemTemplateSelector{}public HierarchicalDataTemplate(){}public HierarchicalDataTemplate(object dataType){}
}
HierarchicalDataTemplate
为 DataTempate
的派生类,同时,也可以将 HierarchicalDataTemplate
视为一个集合控件,能够 ItemTemplate
,也能够添加 ItemTemplateSelector
,那么此时就可以尝试,通过为 HierarchicalDataTemplate
添加数据模板选择器,进行 HierarchicalDataTemplate
内容项的样式选择。
选择器TreeDataTemplateSelector
内容如下:
public class TreeDataTemplateSelector: DataTemplateSelector{public override DataTemplate SelectTemplate(object item, DependencyObject container){TreeItemViewModel treeItem = item as TreeItemViewModel;var fe = container as FrameworkElement;if (treeItem.TreeType == TreeType.Folder){return fe.FindResource("Folder") as DataTemplate;}return fe.FindResource("Node") as DataTemplate;}}
在 HierarchicalDataTemplate
中使用:
<HierarchicalDataTemplate x:Key="Folder" ItemTemplateSelector="{StaticResource TreeDataTemplateSelector}"DataType="{x:Type local:TreeItemViewModel}" ItemsSource="{Binding Children}"><StackPanel Orientation="Horizontal"><TextBlock Text="{Binding Name}"/><TextBlock Text="/"/><TextBlock Text="{Binding TreeType}"/></StackPanel>
</HierarchicalDataTemplate>
运行效果如下:
以上就是 HierarchicalDataTemplate
多级样式的设置解决办法。
WPF疑难问题之Treeview中HierarchicalDataTemplate多级样式相关推荐
- WPF:使用Json.NET在TreeView中树形显示JSON数据
原文 WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工 ...
- 在WPF TreeView中使用复选框
目录 介绍 背景 细节决定成败 功能要求 将Smarts放入ViewModel 树视图配置 将TreeViewItem变成ToggleButton Aero主题中的复选框错误 介绍 本文回顾了一个WP ...
- wpf展开树节点_WPF中展开一个TreeView控件的所有树节点
在 Windows Form 应用中,我们碰到需要展开一个TreeView 控件的所有树节点的时候很简单,微软已经替我们提供了ExpandAll 方法,我们只要简单的一行代码tv_QTree.Expa ...
- 【C#】ADO .Net Entities Framework在WPF TreeView中的应用
XAML代码 <Window x:Class="WpfApplication73.MainWindow" xmlns="http://schemas.microso ...
- WPF应用基础篇---TreeView
1.前言 最近有部分朋友经常问我,WPF的TreeView控件,如何用MVVM来实现绑定和显示?所以写下了这篇WPF应用基础篇---TreeView. 2.介绍 案例浏览: 图 1-1(案例结构图) ...
- 详解Silverlight Treeview的HierarchicalDataTemplate使用
在Silverlight项目中,Treeview控件是比较常用的表示层次或者等级的控件,该控件可以非常清晰的显示数据之间的隶属关系.对于Treeview控件的基本使用已经有很多文章介绍,这里我想讲解一 ...
- [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口
原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...
- [WPF疑难]ErrorTemplate显示与隐藏问题
[WPF疑难]ErrorTemplate显示与隐藏问题 周银辉 1,问题描述: 在为Binding提供验证模板时,我们需要 ...
- [WPF疑难] 继承自定义窗口
[WPF疑难] 继承自定义窗口 原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 ...
最新文章
- gdb+gdbserver
- Shell 函数、数组与正则表达式
- 设计模式-建造者模式(05)
- Httprunner测试
- python 输出在固定位置_python多进程/线程抢占stdoutput总是在固定位置截断上个输出?...
- GDCM:gdcm::Object的测试程序
- 鼠标右键转圈圈_win10系统右键一直转圈
- torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor
- 程序员的奋斗史(三十五)——人在囧途之应聘篇(五)
- .net项目进不去后台解决
- Crackme008
- linux gif录制工具,教学?演示?在Linux下安装超好用的屏幕录像机来录制gif动画...
- 使用Postman获取北京时间校准接口API(Json格式)
- TalkingData
- 袁帅做了两件意义非凡的事
- STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式
- 组装一台电脑需要哪些基本配件?
- python 字符串结束符_python字符串以反斜杠结尾
- JAVA基础-50道编程题
- python - RSA加密
热门文章
- HDU6356 Glad You Came(2018HDU多校联赛第五场,线段树)
- 设置cookies过期时间的几种方法(cookies随浏览器关闭而失效的方法)
- 微信退款No appropriate protocol (protocol is disabled or cipher suites are inappropriate)问题解决
- 基于springboot的校园跑腿系统
- System Verilog clocking块
- 作为开发者必须知道的5个安卓应用推广方式
- mysql数据库集群版_MySql数据库集群
- Docker部署微服务时Springcloud网关报错 java.net.UnknownHostException: xxx: Name or service not known
- 公司常用云服务器详解:企业2核4G、4核8G、8核16G配置介绍
- Windows DHCP Server基于MAC地址过滤客户端请求实现IP地址的分配