WPF日积月累之TreeView动态绑定
一、概述
本文演示了如何递归生成数据,用于绑定TreeView以及TreeItem的双击事件。
二、参考代码
1 using System;
2 using System.Collections.Generic;
3 using System.ComponentModel;
4 using System.Linq;
5 using System.Windows;
6 using System.Windows.Controls;
7 using System.Windows.Input;
8
9 namespace BindingDemo6TreeBinding
10 {
11
12 /// <summary>
13 /// Interaction logic for MainWindow.xaml
14 /// </summary>
15 public partial class MainWindow : Window
16 {
17 public MainWindow()
18 {
19 InitializeComponent();
20
21 #region 用于绑定的数据
22 List<TreeItem> grpLst = new List<TreeItem>(){
23 new TreeItem(){ID=0,ItemName="Root", ParentId = -1,IsExpanded=true},//设置初始状态为展开状态
24
25 new TreeItem(){ID=1,ItemName="Item1",ParentId=0},
26 new TreeItem(){ID=2,ItemName="Item1-1",ParentId=1},
27 new TreeItem(){ID=3,ItemName="Item1-2",ParentId=1},
28 new TreeItem(){ID=4,ItemName="Item1-3",ParentId=1},
29
30 new TreeItem(){ID=5,ItemName="Item1-3-1",ParentId=4},
31 new TreeItem(){ID=6,ItemName="Item1-3-2",ParentId=4},
32
33
34
35 new TreeItem(){ID=7,ItemName="Item2",ParentId=0},
36 new TreeItem(){ID=8,ItemName="Item2-1",ParentId=7},
37 new TreeItem(){ID=9,ItemName="Item2-2",ParentId=7},
38
39 new TreeItem(){ID=10,ItemName="Item3",ParentId=0}
40 };
41 #endregion
42
43 this.cmbGoup.ItemsSource = grpLst;//comboBox数据源
44 this.cmbGoup.SelectedValuePath = "ID";
45 this.cmbGoup.DisplayMemberPath = "ItemName";
46
47 List<TreeItem> lstGroup = getTreeData(-1, grpLst);//初始化时获取父节点为-1的数据
48 this.tvGroup.ItemsSource = lstGroup;//数据绑定
49 }
50 /// <summary>
51 /// 递归生成树形数据
52 /// </summary>
53 /// <param name="delst"></param>
54 /// <returns></returns>
55 public List<TreeItem> getTreeData(int parentid, List<TreeItem> nodes)
56 {
57 List<TreeItem> mainNodes = nodes.Where(x => x.ParentId == parentid).ToList<TreeItem>();
58 List<TreeItem> otherNodes = nodes.Where(x => x.ParentId != parentid).ToList<TreeItem>();
59 foreach (TreeItem grp in mainNodes)
60 {
61 grp.ChildrenItems = getTreeData(grp.ID, otherNodes);
62 }
63 return mainNodes;
64 }
65
66 /// <summary>
67 /// 下拉框关闭事件
68 /// </summary>
69 /// <param name="sender"></param>
70 /// <param name="e"></param>
71 private void cmbGoup_DropDownClosed(object sender, EventArgs e)
72 {
73 if (this.cmbGoup.SelectedValue == null)
74 {
75 return;
76 }
77 int groupId = (int)this.cmbGoup.SelectedValue;//选中的组号
78 List<TreeItem> lstGroup = getTreeData(groupId, (List<TreeItem>)cmbGoup.ItemsSource);
79 this.tvGroup.ItemsSource = lstGroup;
80 }
81
82
83 private void tvDomain_MouseDoubleClick(object sender, MouseButtonEventArgs e)
84 {
85 TreeViewItem trvItem = sender as TreeViewItem;
86 if(trvItem.IsSelected)
87 {
88 TreeItem selectedItem = (TreeItem)(this.tvGroup.SelectedItem);
89 MessageBox.Show(selectedItem.ItemName);
90 }
91 }
92 }
93 public class TreeItem:ViewModelBase
94 {
95 public TreeItem()
96 {
97 this.ChildrenItems = new List<TreeItem>();
98 this.ParentId = 0;//主节点的父id默认为0
99 }
100
101 public List<TreeItem> ChildrenItems { get; set; }
102 public int ID { get; set; }//id
103 public int ParentId { get; set; }//parentID
104 public string ItemName { get; set; }
105
106 private bool isExpanded;
107 public bool IsExpanded { get { return isExpanded; } set { isExpanded = value;
108 OnPropertyChanged(nameof(IsExpanded));
109 } }
110
111
112 private bool isSelected;
113 public bool IsSelected
114 {
115 get { return isSelected; }
116 set
117 {
118 isSelected = value;
119 OnPropertyChanged(nameof(IsSelected));
120 }
121 }
122
123
124
125
126 }
127 public abstract class ViewModelBase : INotifyPropertyChanged, IDisposable
128 {
129 public virtual string DisplayName { get; set; }
130
131 public event PropertyChangedEventHandler PropertyChanged;
132
133 protected void OnPropertyChanged(string propertyName)
134 {
135 PropertyChangedEventHandler handler = PropertyChanged;
136
137 if (handler != null)
138 {
139 handler(this, new PropertyChangedEventArgs(propertyName));
140 }
141 }
142
143
144 #region IDisposable Members
145
146 public void Dispose()
147 {
148 this.OnDispose();
149
150 }
151
152 protected virtual void OnDispose()
153 {
154 }
155
156 #endregion
157 }
158 }
1 <Window x:Class="BindingDemo6TreeBinding.MainWindow"
2 xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
3 xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
4 xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
5 xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
6 xmlns:local="clr-namespace:BindingDemo6TreeBinding"
7 mc:Ignorable="d"
8 Title="MainWindow" Height="350" Width="525">
9 <Grid >
10 <Grid.RowDefinitions>
11 <RowDefinition Height="81*"/>
12 <RowDefinition Height="239*"/>
13 </Grid.RowDefinitions>
14 <Grid.ColumnDefinitions>
15 <ColumnDefinition Width="178*"/>
16 <ColumnDefinition Width="339*"/>
17 </Grid.ColumnDefinitions>
18 <StackPanel Margin="10" Grid.ColumnSpan="2">
19 <Label Content="选择组节点:"></Label>
20 <ComboBox MaxDropDownHeight="100" Name="cmbGoup" DropDownClosed="cmbGoup_DropDownClosed" ></ComboBox>
21 </StackPanel>
22 <StackPanel Margin ="10" Grid.Row="1">
23 <TreeView x:Name="tvGroup" ScrollViewer.CanContentScroll="True" ScrollViewer.VerticalScrollBarVisibility="Visible" ScrollViewer.HorizontalScrollBarVisibility="Auto">
24 <TreeView.ItemContainerStyle>
25 <Style TargetType="{x:Type TreeViewItem}">
26 <Setter Property="IsExpanded" Value="{Binding IsExpanded,Mode=TwoWay}" />
27 <Setter Property="IsSelected" Value="{Binding IsSelected,Mode=TwoWay}"/>
28 <EventSetter Event="MouseDoubleClick" Handler="tvDomain_MouseDoubleClick"></EventSetter>
29 </Style>
30 </TreeView.ItemContainerStyle>
31 <TreeView.ItemTemplate>
32 <HierarchicalDataTemplate ItemsSource="{Binding ChildrenItems}">
33 <StackPanel>
34 <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding ItemName}" Margin="2,0,0,0"></TextBlock>
35 </StackPanel>
36 </HierarchicalDataTemplate>
37 </TreeView.ItemTemplate>
38 </TreeView>
39 </StackPanel>
40 <GroupBox Grid.Column="1" Grid.Row="1" Margin="2" BorderThickness="0.6" BorderBrush="Silver">
41
42
43 <Frame x:Name="mainFrame" Margin="2" ScrollViewer.CanContentScroll="True" NavigationUIVisibility="Hidden" />
44
45 </GroupBox>
46 </Grid>
47 </Window>
WPF日积月累之TreeView动态绑定的更多相关文章
- WPF MVVM实现TreeView
今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1 图2 模版加上了一个checkbox,选中父类的checkb ...
- WPF如何用TreeView制作好友列表、播放列表
WPF如何用TreeView制作好友列表.播放列表 前言 TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表).音乐播放器(播放列表).类库展示器(树形类结构)等都用的是T ...
- WPF如何用TreeView制作好友列表、播放列表(转)
WPF如何用TreeView制作好友列表.播放列表 前言 TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表).音乐播放器(播放列表).类库展示器(树形类结构)等都用的是T ...
- WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)
原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...
- Silverlight TreeView 动态绑定Xml 文件
随着应用程序的不断升级,客户的需求不断增多,程序员不得不对自己的应用程序做出相应的修改,如果修改的内容较多,那么就必须找出一种简便方法,下面就为大家介绍一下在SilverLight 中左边导航栏T ...
- WPF如何实现TreeView节点重命名
我们经常看到一些软件比如酷狗音乐,在对列表右键进行重命名的时候,当前列表会泛白并且进入可编辑状态,当我们更改完成后就会并进入非编辑状态,这些具体是怎么实现的呢?下面的方法也许会提供一些思路,下面的Tr ...
- WPF控件TreeView使用
需要多级嵌套要用TreeViewItem,而这个在大纲视图右键控件可以点出来. 代码控制嵌套Items就可以. 如果显示"(集合)",检查嵌套的是不是TreeViewItem的It ...
- WPF - MVVM 之TreeView
在项目中使用OnPropertyChanged方法,最简单的实例: private event PropertyChangedEventHandler PropertyChanged; protect ...
- WPF中为ListView动态绑定数据(可参考)
GridView gv = new GridView(); DataTable dt = fieldManageBLL.GetFieldManage(moduleName); for(int i=0; ...
随机推荐
- ES6新增语法(二)——函数和参数
箭头函数 箭头函数:将原来函数的function关键字和函数名都删掉,并使用"=>"连接参数列表和函数体. 箭头函数语法: (参数1,参数2)=>{ 函数体 } 注意点 ...
- [刘阳Java]_Web前端入门级练习_迅雷官宣网设计
也有一段时间没有写一些技术专题文章,今天给大家来几篇Web前端入门级练习的文章.主讲<迅雷官宣网>的设计,相信大家平时也用过迅雷这个下载工具,所以分享的这篇技术大家在一定程序会感兴趣. 先 ...
- 莫比乌斯反演&整除分块学习笔记
整除分块 用于计算$\sum_{i=1}^n f(\lfloor{n/i} \rfloor)*i$之类的函数 整除的话其实很多函数值是一样的,对于每一块一样的商集中处理即可 若一个商的左边界为l,则右 ...
- 微信小程序云开发-数据库-删除数据
一.js文件使用.remove()删除单条数据 在js文件中写updategood函数,在函数中使用.doc()指定要删除的数据id,调用.remove()方法删除数据. 二.wxml文件添加[删除] ...
- PAT乙级:1087 有多少不同的值 (20分)
PAT乙级:1087 有多少不同的值 (20分) 当自然数 n 依次取 1.2.3.--.N 时,算式 ⌊n/2⌋+⌊n/3⌋+⌊n/5⌋ 有多少个不同的值?(注:⌊x⌋ 为取整函数,表示不超过 x ...
- mysql jdbc8.0连接mysql
- AppWeb认证绕过漏洞(CVE-2018-8715)
影响范围 Appweb 7.0.2及早期版本. 复现 构造头Authorization: Digest username=admin 返回包里包含session 发送POST请求,添加session到 ...
- 2020厦门大学综述翻译:3D点云深度学习(Remote Sensiong期刊)
目录 摘要 1.引言: 2.点云深度学习的挑战 3.基于结构化网格的学习 3.1 基于体素 3.2 基于多视图 3.3 高维晶格 4.直接在点云上进行的深度学习 4.1 PointNet 4.2 局部 ...
- 使用 C++ WinRT 组件
创建 C++ WinRT 组件 通过 Cpp/WinRT 项目模板创建一个 WinRT 组件工程 CppWinrtComponent.vcxproj,主要接口定义如下: namespace CppWi ...
- 【SpringCloud微服务实战】搭建企业级应用开发框架(一):架构说明
SpringCloud分布式应用微服务系统架构图: SpringCloud分布式应用微服务系统组件列表: 微服务框架组件:Spring Boot2 + SpringCloud Hoxton.SR8 + ...