wpf treeview 数据绑定 递归绑定节点

1.先上效果

将所有节点加入ComboBox数据源,在ComboBox中选择时下方Treeview显示该节点下的子节点。

1.xaml文件,将以下代码加入界面合适位置

 1     <StackPanel>
 2             <StackPanel Margin="10">
 3                 <Label Content="选择组节点:"></Label>
 4                 <ComboBox MaxDropDownHeight="100" Name="cmbGoup" DropDownClosed="cmbGoup_DropDownClosed"></ComboBox>
 5             </StackPanel>
 6             <StackPanel Margin ="10">
 7                 <TreeView x:Name="tvGroup">
 8                     <TreeView.ItemTemplate>
 9                         <HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
10                             <StackPanel>
11                                 <TextBlock VerticalAlignment="Center" FontSize="14" Text="{Binding GroupName}" Margin="2,0,0,0"></TextBlock>
12                             </StackPanel>
13                         </HierarchicalDataTemplate>
14                     </TreeView.ItemTemplate>
15                 </TreeView>
16             </StackPanel>
17         </StackPanel>

2.后台代码

a.用于绑定的节点类

 1     public class Group
 2     {
 3         public Group()
 4         {
 5             this.Nodes = new List<Group>();
 6             this.ParentId = 0;//主节点的父id默认为0
 7         }
 8
 9         public List<Group> Nodes { get; set; }
10         public int ID { get; set; }//id
11         public int ParentId { get; set; }//parentID
12         public string GroupName { get; set; }
13     }

b.主界面类代码

public partial class MainWindow : Window
    {
        public MainWindow()
        {
            InitializeComponent();

            #region 用于绑定的数据
            List<Group> grpLst = new List<Group>(){
                new Group(){ID=0,GroupName="Group", ParentId = -1},
                new Group(){ID=1,GroupName="Group1",ParentId=0},
                new Group(){ID=2,GroupName="Group2",ParentId=0},
                new Group(){ID=3,GroupName="Group1_1",ParentId=1},
                new Group(){ID=4,GroupName="Group1_2",ParentId=1},
                new Group(){ID=5,GroupName="Group1_3",ParentId=1},
                new Group(){ID=6,GroupName="Group1_4",ParentId=1},
                new Group(){ID=7,GroupName="Group1_5",ParentId=1},
                new Group(){ID=8,GroupName="Group2_1",ParentId=2},
                new Group(){ID=9,GroupName="Group2_2",ParentId=2},
                new Group(){ID=10,GroupName="Group2_3",ParentId=2},
                new Group(){ID=11,GroupName="Group2_4",ParentId=2},
                new Group(){ID=12,GroupName="Group1_1_1",ParentId=3},
                new Group(){ID=13,GroupName="Group1_1_2",ParentId=3},
                new Group(){ID=14,GroupName="Group1_2_1",ParentId=4},
                new Group(){ID=15,GroupName="Group1_1_1_1",ParentId=12}
            };
            #endregion

            this.cmbGoup.ItemsSource = grpLst;//comboBox数据源
            this.cmbGoup.SelectedValuePath = "ID";
            this.cmbGoup.DisplayMemberPath = "GroupName";

            List<Group> lstGroup = getTreeData(-1, grpLst);//初始化时获取父节点为-1的数据
            this.tvGroup.ItemsSource = lstGroup;//数据绑定
        }

        /// <summary>
        /// 递归生成树形数据
        /// </summary>
        /// <param name="delst"></param>
        /// <returns></returns>
        public List<Group> getTreeData(int parentid, List<Group> nodes)
        {
            List<Group> mainNodes = nodes.Where(x => x.ParentId == parentid).ToList<Group>();
            List<Group> otherNodes = nodes.Where(x => x.ParentId != parentid).ToList<Group>();
            foreach (Group grp in mainNodes)
            {
                grp.Nodes = getTreeData(grp.ID, otherNodes);
            }
            return mainNodes;
        }

        /// <summary>
        /// 下拉框关闭事件
        /// </summary>
        /// <param name="sender"></param>
        /// <param name="e"></param>
        private void cmbGoup_DropDownClosed(object sender, EventArgs e)
        {
            if (this.cmbGoup.SelectedValue == null)
            {
                return;
            }
            int groupId = (int)this.cmbGoup.SelectedValue;//选中的组号
            List<Group> lstGroup = getTreeData(groupId, (List<Group>)cmbGoup.ItemsSource);
            this.tvGroup.ItemsSource = lstGroup;
        }
    }
时间: 2024-10-16 11:26:18

wpf treeview 数据绑定 递归绑定节点的相关文章

WPF TreeView 展开到指定节点

最近在做一个交换机管理的项目,有一个交换机的树,做树的搜索的时候 展开节点居然有点难,自己记录下来 ,以后用的到的时候可以看一下. 展开代码如下,其中 SwitchTree是treeview空间的名称,TreeNode 是绑定在树上的数据类的名称,请注意 private void ExpendTree(TreeNode node) { SwitchTree.UpdateLayout(); for (int i = 0; i < SwitchTree.Items.Count; i++) { Tre

WPF 组织机构下拉树多选,递归绑定方式现实

原文:WPF 组织机构下拉树多选,递归绑定方式现实 使用HierarchicalDataTemplate递归绑定现实 XAML代码: <UserControl x:Class="SunCreate.CombatPlatform.Client.MultiSelOrgTree" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation" xmlns:x="http://schemas

TreeView树形控件递归绑定数据库里的数据

TreeView树形控件递归绑定数据库里的数据. 第一步:数据库中查出来的表,字段名分别为UNAME(显示名称),DID(关联数据),UTYPE(类型) 第二步:前台代码 1 <%@ Page Language="C#" AutoEventWireup="true" CodeBehind="tree.aspx.cs" Inherits="Maticsoft.Web.tree" %> 2 3 <!DOCTYPE

WPF TreeView 选择事件执行两次,获取TreeView的父节点的解决方法

1.TreeView选择事件执行两次 Very often, we need to execute some code in SelectedItemChanged depending on the selected TreeViewItem. ButSelectedItemChanged is called twice. This is due to stealing focus from the main window, which is screwing something up. Wha

WPF TreeView绑定字典集合

1 <TreeView Name="Tree" HorizontalAlignment="Left" Height="269" Width="292" > 2 3 <TreeView.ItemTemplate> 4 <HierarchicalDataTemplate ItemsSource="{Binding Value}"> 5 <StackPanel> 6

WPF TreeView绑定xaml的写法(转)

WPF TreeView绑定xaml的写法 2018年05月30日 10:16:27 dxm809 阅读数:441 方法一 <Window x:Class="TreeViewDemo.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"        xmlns:x="http://schemas.microsoft.com/winfx/2006/x

WPF TreeView 减少节点的缩进

WPF TreeView 减少节点的缩进 [服务器破旧,速度较慢,见谅!] 原文地址:https://www.cnblogs.com/swack/p/11363658.html

WPF TreeView递归遍历相关方法

1 /// <summary> 2 /// 递归改变组织树选中状态. 3 /// </summary> 4 /// <param name="org"></param> 5 private void RecursionOrgDataTreeStatus(OrgData org) 6 { 7 foreach (var item in org.Nodes) 8 { 9 item.IsChecked = org.IsChecked; 10 if

WPF(6):概念绑定

WPF 的体系结构,标记扩展,依赖属性,逻辑树/可视化树,布局,转换等.今天,我们将讨论 WPF 最重要的一部分——绑定.WPF 带来了优秀的数据绑定方式,可以让我们绑定数据对象,这样每次对象发生更改都能引发对应的改变.数据绑定最主要的目的是确保 UI 上的改变总是自动和内部的对象结构同步.在进一步讨论前,我们先看一下我们已经讨论过的问题. 数据绑定技术是在 WPF 技术之前就出现了.在 ASP.NET 中,我们通过绑定数据元素来渲染控件中适当的数据.我们通常传入一个 DataTable 并且绑