WPF 由TreeView想到的 DataTemplate,HierarchicalDataTemplate
DataTemplate简而言之,解决的就是后台代码中的类以怎么样的形式展现在xaml前台代码中的问题。
所以DataTemplate一般都要指定DataType,一般放在resource中,而HierarchicalDataTemplate是一种特殊的DataTemplate,
它指定一个ItemsSource,当自身属性是列表时,有次序的在前台展示下去。
以下是一个简单的Demo
<Window x:Class="EB_Func_DB.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:EB_Func_DB"
mc:Ignorable="d"
Title="MainWindow" Height="450" Width="800">
<Window.Resources>
<HierarchicalDataTemplate DataType="{x:Type local:Module}"
ItemsSource="{Binding SubModules}">
<TextBlock Text="{Binding Path=Name}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="添加子模块" Click="MenuItem_Click_2" CommandParameter="{Binding}"/>
<MenuItem Header="删除模块" Click="MenuItem_Click_1" CommandParameter="{Binding}"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:SubModule}"
ItemsSource="{Binding PlugInFuncs}">
<TextBlock Text="{Binding Path=Name}">
<TextBlock.ContextMenu>
<ContextMenu>
<MenuItem Header="添加功能" Click="MenuItem_Click_4" CommandParameter="{Binding}" />
<MenuItem Header="删除子模块" Click="MenuItem_Click_3" CommandParameter="{Binding}" />
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
<HierarchicalDataTemplate DataType="{x:Type local:PlugInFunc}">
<TextBlock Text="{Binding Path=FuncName}">
<TextBlock.ContextMenu>
<ContextMenu >
<MenuItem Header="添加功能" Click="MenuItem_Click_4" CommandParameter="{Binding}"/>
<MenuItem Header="删除功能" Click="MenuItem_Click_5" CommandParameter="{Binding}"/>
</ContextMenu>
</TextBlock.ContextMenu>
</TextBlock>
</HierarchicalDataTemplate>
</Window.Resources>
<Grid>
<Grid.RowDefinitions>
<RowDefinition Height="30"/>
<RowDefinition Height="30"/>
<RowDefinition/>
<RowDefinition/>
<RowDefinition Height="30"/>
</Grid.RowDefinitions>
<Grid Grid.Row="0">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="100"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="专业:" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<ComboBox x:Name="majorComBox" Grid.Column="1" VerticalAlignment="Center" HorizontalAlignment="Center" Width="95" Margin="2"/>
</Grid>
<Grid Grid.Row="1">
<Grid.ColumnDefinitions>
<ColumnDefinition Width="80"/>
<ColumnDefinition Width="200"/>
<ColumnDefinition Width="35"/>
<ColumnDefinition Width="45"/>
<ColumnDefinition/>
</Grid.ColumnDefinitions>
<TextBlock Grid.Column="0" Text="插件路径:" VerticalAlignment="Center" HorizontalAlignment="Center"/>
<TextBlock Grid.Column="1" x:Name="pathTextBox" VerticalAlignment="Center" HorizontalAlignment="Center" Text="unselected" Foreground="Gray" Width="195" Margin="2"/>
<Button Grid.Column="2" x:Name="pathBtn" VerticalAlignment="Center" HorizontalAlignment="Center" Content="···" Click="pathBtn_Click" Width="30" Margin="2"/>
</Grid>
<DataGrid Grid.Row="2" x:Name="funcDataGrid" AutoGenerateColumns="False" CanUserAddRows="False"
CanUserDeleteRows="False" CanUserSortColumns="False" RowHeaderWidth="0"
MouseDoubleClick="funcDataGrid_MouseDoubleClick"
>
<DataGrid.ColumnHeaderStyle>
<Style TargetType="DataGridColumnHeader">
<Setter Property="HorizontalContentAlignment" Value="Center"></Setter>
<Setter Property="VerticalContentAlignment" Value="Center"></Setter>
</Style>
</DataGrid.ColumnHeaderStyle>
<DataGrid.Columns>
<DataGridCheckBoxColumn Header="是否加入数据库" Binding="{Binding Checked}">
</DataGridCheckBoxColumn>
<DataGridTextColumn Header="名称" Binding="{Binding Path=Name}" IsReadOnly="True">
</DataGridTextColumn>
<DataGridTextColumn Header="描述" Binding="{Binding Path=Describe}" IsReadOnly="True">
</DataGridTextColumn>
<DataGridTextColumn Header="是否在数据库" Binding="{Binding Path=Info}" IsReadOnly="True">
</DataGridTextColumn>
</DataGrid.Columns>
</DataGrid>
<TreeView Grid.Row="3" x:Name="treeView"
>
<TreeView.ItemContainerStyle>
<Style TargetType="TreeViewItem">
<Setter Property="IsExpanded" Value="True" />
</Style>
</TreeView.ItemContainerStyle>
<TreeView.ContextMenu>
<ContextMenu>
<MenuItem Header="增加模块" Click="MenuItem_Click"/>
</ContextMenu>
</TreeView.ContextMenu>
</TreeView>
<Button Grid.Row="4" x:Name="ok" Content="确定" Click="ok_Click"/>
</Grid>
</Window>
值得注意的是,每个HierarchicalDataTemplate(除了最后一级),都需要设置Itemssource在resource中,来指定其下一级别。
WPF 由TreeView想到的 DataTemplate,HierarchicalDataTemplate的更多相关文章
- [WPF实用技巧]如何使WPF的TreeView节点之间有连线
示例代码:TreeViewEx.zip 原文地址:http://www.codeproject.com/Tips/673071/WPF-TreeView-with-WinForms-Style-Fom ...
- WPF中的数据模板(DataTemplate)(转)
原文地址 http://www.cnblogs.com/zhouyinhui/archive/2007/03/30/694388.html WPF中的数据模板(DataTemplate) ...
- WPF中TreeView.BringIntoView方法的替代方案
原文:WPF中TreeView.BringIntoView方法的替代方案 WPF中TreeView.BringIntoView方法的替代方案 周银辉 WPF中TreeView.BringIntoVie ...
- WPF中的数据模板(DataTemplate)
原文:WPF中的数据模板(DataTemplate) WPF中的数据模板(DataTemplate) ...
- WPF中TreeView单击展开其子元素以及点击一个元素展开其他元素收起
TreeView单击展开其子元素: 在WPF的TreeView控件中,要想展开它的子元素,我们必须要鼠标左键点两下或者右键点一下,那么我们怎样实现左键点一下就使它展开呢? Xaml: <Grid ...
- [WPF系列]-TreeView的常用事项
引言 项目经常会用Treeview来组织一些具有层级结构的数据,本节就将项目使用Treeview常见的问题作一个总结. DataBinding数据绑定 DataTemplate自定义 <Hier ...
- WPF之Treeview实现MVVM双向绑定
Treeview分别有两个数据模板HierarchicalDataTemplate(层级数据模板)和DataTemplate(数据模板),分别应用于生成子数据项和普通数据项. 在使用过程中,如果对两个 ...
- WPF中TreeView控件SelectedItemChanged方法的MVVM绑定
问题描述:左侧treeview控件中点击不同类别的节点时,右侧的页面会显示不同的权限.比如对于My Publications,拥有Modify和Delete两种权限,对于My Subscription ...
- WPF中TreeView控件数据绑定和后台动态添加数据(二)
写在前面:在(一)中,介绍了TreeView控件MVVM模式下数据绑定的方法.在这篇文章中,将总结给节点添加事件的方法,这样说有些不对,总之实现的效果就是点击某个节点,将出现对应于该节点的页面或者数据 ...
- WPF中TreeView的使用
因为项目中需要用到TreeView控件,由于是第一次在WPF中用到,因此事先在网上搜了很多关于数据绑定的方法介绍,个人经过实际应用,觉得WPF中的HierarchicalDataTemplate定义模 ...
随机推荐
- 【Blender】杂项笔记
[Blender]杂项笔记 空间坐标系 Blender 中的轴向: Y 轴向前(前视图看向的方向就是前方,其默认向 Y 轴看) Z 轴向上 保持轴向导出到 Unity 时(包括直接保存.导出 FBX ...
- Leetcode 236. 二叉树的最近公共祖先 & 235. 二叉搜索树的最近公共祖先(Python3)
236. 二叉树的最近公共祖先 给定一个二叉树, 找到该树中两个指定节点的最近公共祖先. 最近公共祖先的定义为:"对于有根树 T 的两个结点 p.q,最近公共祖先表示为一个结点 x,满足 x ...
- VS2019 MSB6006 "CL.exe"已退出,错误代码 5
以下为我的解决过程: 因为我不是干C++的,而且我们内网不通外网,我当初来的时候装的vs2019全家桶,然后他们开发用的是vs2015,项目有用c++做图像处理的东西,我本地的vs2015没有C++模 ...
- Ubuntu详细的安装和配置ssh教程
Ubuntu安装和配置ssh的步骤如下: 打开终端,输入以下命令安装ssh: sudo apt-get install openssh-server 安装完成后,启动ssh服务: sudo syste ...
- Maxmspjitter实现实时抓取摄像头画面并制成序列图 (定时抓拍)
实时监控.拍照.录像外设的影像画面在B站上我已有所总结,见下面的网址. https://www.bilibili.com/read/cv13149329?spm_id_from=333.999.0.0 ...
- linux系统测试磁盘IO速度 - fio使用
****** 很重要 很有用 很牛逼 的linux下的测试磁盘io速度的脚本 1 安装工具库 安装fio 首先,你需要安装fio.在不同的Linux发行版中,安装方法可能有所不同. fio可以通过命令 ...
- Easyexcel(2-文件读取)
同步读取 读取单个Sheet 通过sheet方法指定对应的Sheet名称或下标读取文件信息 通过doReadSync方法实现同步读取 @Data public class UserExcel { @E ...
- 解决 Ubuntu 22.04 下 flameshot 截图工具无法使用的问题
问题描述 flameshot 是 Linux 端广受好评的一款截图工具,但在 Ubuntu 22.04 中,安装完成后却不能使用,表现为截图命令无响应,或截图过程报错. 通过查阅 flameshot ...
- pycharm clone GitHub 提示 OpenSSL SSL_read: Connection was reset, errno 10054
配置界面 错误提示 原因分析 clone的时候需要安全认证,当你在配置页面勾选上ssh ,就会报错 解决方案 在cmd里输入命令,然后再clone git config --global http.s ...
- Django实战项目-学习任务系统-用户注册
接着上期代码框架,开发第2个功能,用户注册,在原有用户模型基础上,增加一个学生用户属性表,用来关联学生用户的各种属性值,这个属性表是参考网络小说里系统属性值设计的,方便直观了解用户的能力高低,等级以及 ...