WPF一个完整的TreeView使用实例:(一)自定义控件样式+数据源绑定+动态添加父子节点

本文介绍了一个WPF TreeView的实战案例,包括自定义控件样式、数据源绑定和动态添加父子节点。通过设置控件样式和使用HierarchicalDataTemplate,实现树结构数据的展示,并展示了如何在后台实现节点样式和行为的定制。此外,还预告了后续将涉及的拖拽操作、右键菜单功能以及节点重命名等功能。
摘要由CSDN通过智能技术生成

TreeView控件可在树结构中显示分层数据,其中的项可以展开和折叠。它可以包含多种类型的控件,如Button、Lable、Image等控件,可以通过绑定到数据源并使用HieratchicalDataTemplate对象来填充其树。可以修改默认ControlTemplate以使控件具有独特的外观。

这里举一个完整的TreeView实例来进行说明。本节主要实现自定义控件样式+数据源绑定+动态添加父子节点的功能。效果如下:

1、主窗体中加入TreeView控件

        <TreeView x:Name="treeView" Background="Transparent" MinHeight="280" Width="200"
                  ScrollViewer.HorizontalScrollBarVisibility="Hidden" ScrollViewer.VerticalScrollBarVisibility="Auto"
                  MouseDoubleClick="TreeView_MouseDoubleClick">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate ItemsSource="{Binding Path=ChildNodes}">
                    <TextBlock x:Name="showName" HorizontalAlignment="Left" VerticalAlignment="Center" Margin="0,8,0,0" Height="26"
                               FontSize="{Binding Path=SetFontSize}" FontWeight="{Binding Path=SetFontWeight}" Text="{Binding Path=NodeName, Mode=TwoWay}" />
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

由于我们的这个TreeView控件父子节点字体样式、背景颜色等不同,所以使用Binding的方式通过后台进行设置。

2、TreeView的Model:TreeViewNode.cs

    public class TreeViewNode : INotifyPropertyChanged
    {
        public event PropertyChangedEventHandler PropertyChanged;
        protected virtual void OnPropertyChanged([CallerMemberName] string propertyName = null)
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null) handler(this, new PropertyChangedEventArgs(propertyName));
        }

        #region 属性字段
        private int id;
        /// <summary>
        /// 节点ID
        /// </summary>
        public int Id
        {
            get
            {
                return id;
            }
            set
            {
                id = value;
            }
        }

        private int parentId;
        /// <summary>
        /// 父节点ID
        /// </summary>
        public int ParentId
        {
            get
            {
                return parentId;
            }
            set
            {
                parentId = value;
            }
        }

        private string nodeName;
        /// <summary>
        /// 节点名称(最多六个字符)
        /// </summary>
        public string NodeName
        {
            get
            {
                return nodeName;
            }
            set
            {
                nodeName = value;
                if (nodeName.Length > 6)
                {
                    //非添加项考虑字符长度
                    if (this.isNodeAdd != true && this.isChildNodeAdd != true)
                    {
                        nodeName = nodeName.Substring(0, 6);
                    }
                }
                OnPropertyChanged("NodeName");
            }
        }

        private bool isChildNode;
        /// <summary>
        /// 是否是子节点
        /// </summary>
        public bool IsChildNode
        {
            get
            {
                return isChildNode;
            }
            set
            {
                isChildNode = value;
            }
        }

        private bool isNodeAdd;
        /// <summary>
        /// 是否添加节点
        /// </summary>
        public bool IsNodeAdd
        {
            get
            {
                return isNodeAdd;
            }
            set
            {
                isNodeAdd = value;
            }
        }

        private bool isChildNodeAdd;
        /// <summary>
        /// 是否是添加子节点
        /// </summary>
        public bool IsChildNodeAdd
        {
            get
            {
                return isChildNodeAdd;
            }
            set
            {
                isChildNodeAdd = value;
            }
        }

        private ObservableCollection<TreeViewNode> childNodes;
        /// <summary>
        /// 子节点数据
        /// </summary>
        public ObservableCollection<TreeViewNode> ChildNodes
        {
            get
            {
                if (childNodes == null)
                {
                    childNodes = new ObservableCollection<TreeViewNode>();
                    childNodes.CollectionChanged += new NotifyCollectionChangedEventHandler(OnMoreStuffChanged);
                }
                return childNodes;
            }
            set
            {
                childNodes = value;
            }
        }
        private void OnMoreStuffChanged(object sender, NotifyCollectionChangedEventArgs e)
        {
            if (e.Action == NotifyCollectionChangedAction.Add)
      
  • 10
    点赞
  • 41
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 2
    评论
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

RunnerDNA

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值