文章目录

  • 一、问题场景
  • 二、解决思路

一、问题场景

日常为 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){}
}

HierarchicalDataTemplateDataTempate 的派生类,同时,也可以将 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多级样式相关推荐

  1. WPF:使用Json.NET在TreeView中树形显示JSON数据

    原文 WPF:使用Json.NET在TreeView中树形显示JSON数据 据 读者可以参考这个开源的可以树形显示XML和JSON的工具: Mgen Object 603:XML/JSON树形显示小工 ...

  2. 在WPF TreeView中使用复选框

    目录 介绍 背景 细节决定成败 功能要求 将Smarts放入ViewModel 树视图配置 将TreeViewItem变成ToggleButton Aero主题中的复选框错误 介绍 本文回顾了一个WP ...

  3. wpf展开树节点_WPF中展开一个TreeView控件的所有树节点

    在 Windows Form 应用中,我们碰到需要展开一个TreeView 控件的所有树节点的时候很简单,微软已经替我们提供了ExpandAll 方法,我们只要简单的一行代码tv_QTree.Expa ...

  4. 【C#】ADO .Net Entities Framework在WPF TreeView中的应用

    XAML代码 <Window x:Class="WpfApplication73.MainWindow" xmlns="http://schemas.microso ...

  5. WPF应用基础篇---TreeView

    1.前言 最近有部分朋友经常问我,WPF的TreeView控件,如何用MVVM来实现绑定和显示?所以写下了这篇WPF应用基础篇---TreeView. 2.介绍 案例浏览: 图 1-1(案例结构图) ...

  6. 详解Silverlight Treeview的HierarchicalDataTemplate使用

    在Silverlight项目中,Treeview控件是比较常用的表示层次或者等级的控件,该控件可以非常清晰的显示数据之间的隶属关系.对于Treeview控件的基本使用已经有很多文章介绍,这里我想讲解一 ...

  7. [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口

    原文:[WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 [WPF疑难] 模式窗口被隐藏后重新显示时变成了非模式窗口 周银辉 现象: 大家可以试试下面这个很有趣但会带来Defect的现象:当我 ...

  8. [WPF疑难]ErrorTemplate显示与隐藏问题

    [WPF疑难]ErrorTemplate显示与隐藏问题                                        周银辉 1,问题描述: 在为Binding提供验证模板时,我们需要 ...

  9. [WPF疑难] 继承自定义窗口

    [WPF疑难] 继承自定义窗口 原文 [WPF疑难] 继承自定义窗口 [WPF疑难] 继承自定义窗口 周银辉 项目中有不少的弹出窗口,按照美工的设计其外边框(包括最大化,最小化,关闭等按钮)自然不同于 ...

最新文章

  1. gdb+gdbserver
  2. Shell 函数、数组与正则表达式
  3. 设计模式-建造者模式(05)
  4. Httprunner测试
  5. python 输出在固定位置_python多进程/线程抢占stdoutput总是在固定位置截断上个输出?...
  6. GDCM:gdcm::Object的测试程序
  7. 鼠标右键转圈圈_win10系统右键一直转圈
  8. torch.gather(input, dim, index, *, sparse_grad=False, out=None) → Tensor
  9. 程序员的奋斗史(三十五)——人在囧途之应聘篇(五)
  10. .net项目进不去后台解决
  11. Crackme008
  12. linux gif录制工具,教学?演示?在Linux下安装超好用的屏幕录像机来录制gif动画...
  13. 使用Postman获取北京时间校准接口API(Json格式)
  14. TalkingData
  15. 袁帅做了两件意义非凡的事
  16. STM32CubeMX学习笔记(15)——电源管理(PWR)低功耗睡眠模式
  17. 组装一台电脑需要哪些基本配件?
  18. python 字符串结束符_python字符串以反斜杠结尾
  19. JAVA基础-50道编程题
  20. python - RSA加密

热门文章

  1. HDU6356 Glad You Came(2018HDU多校联赛第五场,线段树)
  2. 设置cookies过期时间的几种方法(cookies随浏览器关闭而失效的方法)
  3. 微信退款No appropriate protocol (protocol is disabled or cipher suites are inappropriate)问题解决
  4. 基于springboot的校园跑腿系统
  5. System Verilog clocking块
  6. 作为开发者必须知道的5个安卓应用推广方式
  7. mysql数据库集群版_MySql数据库集群
  8. Docker部署微服务时Springcloud网关报错 java.net.UnknownHostException: xxx: Name or service not known
  9. 公司常用云服务器详解:企业2核4G、4核8G、8核16G配置介绍
  10. Windows DHCP Server基于MAC地址过滤客户端请求实现IP地址的分配