一、概述

本文演示了如何递归生成数据,用于绑定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动态绑定的更多相关文章

  1. WPF MVVM实现TreeView

    今天有点时间,做个小例子WPF MVVM 实现TreeView 只是一个思路大家可以自由扩展 文章最后给出了源码下载地址 图1   图2     模版加上了一个checkbox,选中父类的checkb ...

  2. WPF如何用TreeView制作好友列表、播放列表

    WPF如何用TreeView制作好友列表.播放列表 前言 TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表).音乐播放器(播放列表).类库展示器(树形类结构)等都用的是T ...

  3. WPF如何用TreeView制作好友列表、播放列表(转)

    WPF如何用TreeView制作好友列表.播放列表 前言 TreeView这个控件对于我来说是用得比较多的,以前做的小聊天软件(好友列表).音乐播放器(播放列表).类库展示器(树形类结构)等都用的是T ...

  4. WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条)

    原文:WPF中获取TreeView以及ListView获取其本身滚动条的方法,可实现自行调节scoll滚动的位置(可相应获取任何控件中的内部滚动条) 对于TreeView而言: TreeViewAut ...

  5. Silverlight TreeView 动态绑定Xml 文件

      随着应用程序的不断升级,客户的需求不断增多,程序员不得不对自己的应用程序做出相应的修改,如果修改的内容较多,那么就必须找出一种简便方法,下面就为大家介绍一下在SilverLight 中左边导航栏T ...

  6. WPF如何实现TreeView节点重命名

    我们经常看到一些软件比如酷狗音乐,在对列表右键进行重命名的时候,当前列表会泛白并且进入可编辑状态,当我们更改完成后就会并进入非编辑状态,这些具体是怎么实现的呢?下面的方法也许会提供一些思路,下面的Tr ...

  7. WPF控件TreeView使用

    需要多级嵌套要用TreeViewItem,而这个在大纲视图右键控件可以点出来. 代码控制嵌套Items就可以. 如果显示"(集合)",检查嵌套的是不是TreeViewItem的It ...

  8. WPF - MVVM 之TreeView

    在项目中使用OnPropertyChanged方法,最简单的实例: private event PropertyChangedEventHandler PropertyChanged; protect ...

  9. WPF中为ListView动态绑定数据(可参考)

    GridView gv = new GridView(); DataTable dt = fieldManageBLL.GetFieldManage(moduleName); for(int i=0; ...

随机推荐

  1. Java基础00-形参和返回值22

    1. 形参和返回值 1.1 类名作为形参和返回值 1.2 抽象类名作为形参和返回值 代码示例: 方法的形参是抽象类名 抽象动物类:定义了一个抽象的eat方法 动物的操作类:创建一个useAnimal方 ...

  2. shell脚本(5)-shell变量

    一.变量介绍 将一些数据需要临时存放在内存中,以待后续使用时快速读出. 二.变量分类 1.本地变量: 用户私有变量,只有本用户可以使用,保存在家目录下的.bash_profile..bashrc文件中 ...

  3. springMVC-2-MVC初步了解

    Spring MVC的特点 轻量级,简单易学 高效 , 基于请求响应的MVC框架 与Spring兼容性好,无缝结合 约定优于配置 功能强大:RESTful.数据验证.格式化.本地化.主题等 简洁灵活 ...

  4. mybatis-7-缓存

    1. 一级缓存: SqlSession 级别, 默认开启, 并且不能关闭 操作数据库是需要创建 SqlSession 对象, 在对象中有一个 HashMap 用于存储缓存数据, 不同的 SqlSess ...

  5. Scrapy 爬虫框架学习笔记(未完,持续更新)

    Scrapy 爬虫框架 Scrapy 是一个用 Python 写的 Crawler Framework .它使用 Twisted 这个异步网络库来处理网络通信. Scrapy 框架的主要架构 根据它官 ...

  6. 关键字替代符号C++

    不知从什么时候的哪里我看到了一个and关键字,心想这是个什么玩意...然后知道它相当于&&,于是开启了罪恶的生涯-- 替代关键字,似乎可读性更好,但是有些编译器可能会无法识别(eg.M ...

  7. ODOO14 ---系统启动方式

    一.通过pycharm启动 1.配置启动面板: 点击启动即可: 第二种.通过CMD窗口启动:进入到odoo-bin的目录下,执行:python E:\odoo14\odoo14\odoo-bin  这 ...

  8. ts 学习笔记-基础篇

    目录 基础 原始数据类型 布尔值 数字 字符串 空值 Null 和 Undefined 任意值 类型推论 联合类型 接口 数组 函数 类型断言 申明文件 什么是申明文件 三斜线指令 第三方声明文件 内 ...

  9. Django报错:'Specifying a namespace in include() without providing an app_name '

    环境:win10(64)+pycharm2018.3+python3.7 在网页项目中使用include()方法 项目目录中同时存在app/urls.py和proj/urls.py 在proj/url ...

  10. 🏆【Java技术专区】「编译器专题」重塑认识Java编译器的执行过程(消除数组边界检查+公共子表达式)!

    前提概要 Java的class字节码并不是机器语言,要想让机器能够执行,还需要把字节码翻译成机器指令.这个过程是Java虚拟机做的,这个过程也叫编译.是更深层次的编译. 在编译原理中,把源代码翻译成机 ...