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; ...
随机推荐
- Java基础00-面向对象基础13
1. 类和对象 1.1 什么是对象 1.2 什么是面向对象 1.3 什么是类 1.4 什么是对象的属性 1.5 什么是对象的行为 行为就是对象能够干什么 1.6 类和对象 ...
- POJ 树的直径和重心
树的直径:(无根)树上最长两点间的最长路径,两次dfs即可,第一次dfs任选一点u,找到距离它最远的点s,再从点s进行一次dfs,找到距离s最远的点t,则s-t之间的路径就是树的直径.证明: < ...
- Python基础之动态添加属性,方法,动态类,静态类
## 动态添加属性class Person: def __init__(self,name): self.name = name# 1.通过对象.属性名称来操作p = Person('KTModel' ...
- python之数据驱动Txt操作
一.新建数据Mail163.txt文本 二.Txt_Mail163.py脚本如下: import unittestfrom selenium import webdriverfrom selenium ...
- [JS]闭包和词法环境
词法环境 词法环境(lexical environment)由两个部分组成: 环境记录--一个存储所有局部变量作为其属性的对象. 对外部词法环境的引用,与外部代码相关联. 全局词法环境在脚本执行前创建 ...
- MySQL问题定位-性能优化之我见
前言 首先任何一个数据库不是独立存在的,也不是凭空想象决定出来的. 数据库的架构离不开应用的场景.所以,为了解决某些深入的问题,首先你得掌握数据库的原理与架构.原理掌握得越深入,越能帮助你定位复杂与隐 ...
- linux下快速安装pyenv管理多版本python
起因 一直服务器python项目都是放docker跑,这次为了测试,不得不在宿主机跑,就必须安装python3.7,但是ubuntu16.04下有点麻烦 尝试 源码安装,懒,算了,也不想污染服务器环境 ...
- 通过Xlib枚举指定进程下所有窗体
在windows系统下如果想要枚举指定进程的窗体,我们可以通过EnumWindows加上自己实现的回调函数进行实现,那么在linux下该如何做呢? 其实也很简单,在linux下,我们可以通过xlib中 ...
- 用 5W1H 告诉你如何规划合理的测试策略
摘要:测试策略描述了测试工程的总体方法和目标.描述目前在进行哪一阶段的测试以及每个阶段内在进行的测试种类(功能测试.性能测试.覆盖测试等)以及测试人力安排等. 本文分享自华为云社区<浅谈敏捷 ...
- SQL遍历日期
IF OBJECT_ID(N'tempdb..#temp', N'U') IS NOT NULL BEGIN DROP TABLE #temp;--临时表删除 END --创建临时表 CREATE T ...