一、概述

本文演示了如何递归生成数据,用于绑定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-IO流27

    1. File 1.1 File类概述和构造方法 File的构造方法:这三个构造方法可以做同样的事情 代码示例: public class File1 { public static void mai ...

  2. 高版本(8以上)tomcat不支持rest中的delete和put方式请求怎么办

    出现问题 当我们去访问delete方式和put方式: 后来才知道tomcat8以上是不支持delete方式和put方式 解决方法: 在跳转目标的jsp头文件上改为(加上了isErrorPage=&qu ...

  3. 利用 PGO 提升 .NET 程序性能

    引子 .NET 6 开始初步引入 PGO.PGO 即 Profile Guided Optimization,通过收集运行时信息来指导 JIT 如何优化代码,相比以前没有 PGO 时可以做更多以前难以 ...

  4. informix错误代码小结

    informix错误代码小结 所有错误可以用finderr+错误代码查到,英文的,这里中文注释便于理解. -100 错误的描述:C-ISAM错误:向具有唯一索引的字段加入一个重复值.  系统的操作:该 ...

  5. No_1 手写Proxy

    手写动态代理主要原理: userDAO=(UserDAO)Proxy.newProxyinstance(classloader,interfaces[],new MyInvocationHandler ...

  6. 京东购物小程序 | Taro3 项目分包实践

    背景 京东购物小程序作为京东小程序业务流量的主要入口,承载着许多的活动和页面,而很多的活动在小程序开展的同时,也会在京东 APP 端进行同步的 H5 端页面的投放.这时候,一个相同的活动,需要同时开发 ...

  7. csredis-in-asp.net core理论实战-哨兵模式-使用示例

    csredis 开源地址 https://github.com/2881099/csredis 续上篇 csredis-in-asp.net core理论实战-主从配置.哨兵模式 示例源码 https ...

  8. 组合数取模(lukas)板子

    求 C(n,m)%mo #include<bits/stdc++.h>#define re register int#define mo 10007#define ll long long ...

  9. NCB | 定量蛋白质组学揭示细胞外泌体通用标志物Syntenin-1

    外泌体 (exosomes) 是由哺乳动物细胞通过"内吞-融合-外排"等机制,主动向胞外释放的纳米级 (直径40~60 nm) 双层囊泡小体,携带蛋白质.核酸.脂质等多种生物活性分 ...

  10. XCTF-Web进阶-upload1

    显然是让我们上传文件,思路当然是上传一个木马文件,然后通过蚁剑连接查看目录获取flag. 但是当我们想要上传php文件的时候会出现弹窗,并且连"上传"按钮都被禁用了. ext = ...