示例:WPF中TreeView自定义TreeNode泛型绑定对象

一、目的:在开发中经常需要绑定TreeView,所以定义了一个泛型的TreeNode<T>用来方便绑定对象和复用

二、实现

cs 复制代码
    public partial class TreeNodeBase<T> : SelectBindable<T>, ITreeNode
    {
        public TreeNodeBase(T t) : base(t)
        {

        }

        private ObservableCollection<TreeNodeBase<T>> _nodes = new ObservableCollection<TreeNodeBase<T>>();

        public ObservableCollection<TreeNodeBase<T>> Nodes
        {
            get { return _nodes; }
            set
            {
                _nodes = value;
                RaisePropertyChanged();
            }
        }
    }

三、环境

VS2022

四、示例

生成测试数据

cs 复制代码
    public class GetTestTreeNodes : MarkupExtension
    {
        public override object ProvideValue(IServiceProvider serviceProvider)
        {
            var roots = this.GetTreeNodeBases().ToList();
            foreach (var item in roots)
            {
                var n1 = this.GetTreeNodeBases();
                foreach (var item1 in n1)
                {
                    var n2 = this.GetTreeNodeBases();
                    item1.Nodes = n2.ToObservable();
                }
                item.Nodes = n1.ToObservable();
            }
            return roots;
        }
        private IEnumerable<TreeNodeBase<Student>> GetTreeNodeBases()
        {
            int c = Random.Shared.Next(3, 15);
            for (int i = 0; i < c; i++)
            {
                yield return new TreeNodeBase<Student>(Student.Random());
            }

        }
    }

其中TreeNode<T> 的T使用的测试Student,实际开发中可以使用任意需要的类型,这样在不需要额外定义树结构的情况下可以绑定到树节点上

Xaml中如下绑定

XML 复制代码
  <TreeView ItemsSource="{local:GetTestTreeNodes}">
                <TreeView.ItemTemplate>
                    <HierarchicalDataTemplate ItemsSource="{Binding Nodes}">
                        <TextBlock VerticalAlignment="Center" Text="{Binding Model.Name}" />
                    </HierarchicalDataTemplate>
                </TreeView.ItemTemplate>
            </TreeView>

显示效果如下

五、需要了解的知识点

TreeView 类 (System.Windows.Controls) | Microsoft Learn

六、源码地址

GitHub - HeBianGu/WPF-ControlDemo: 示例

GitHub - HeBianGu/WPF-ControlBase: Wpf封装的自定义控件资源库

GitHub - HeBianGu/WPF-Control: WPF轻量控件和皮肤库

七、了解更多

System.Windows.Controls 命名空间 | Microsoft Learn

https://github.com/HeBianGu

HeBianGu的个人空间-HeBianGu个人主页-哔哩哔哩视频

相关推荐
mingupup13 小时前
WPF/C#:使用Microsoft Agent Framework框架创建一个带有审批功能的终端Agent
c#·wpf
△曉風殘月〆17 小时前
WPF中的变换(Transform)功能详解
wpf
mingupup17 小时前
为WPF应用增加项目图标
wpf
张人玉20 小时前
c#WPF基础知识
开发语言·c#·wpf
yantuguiguziPGJ1 天前
WPF 联合 Web 开发调试流程梳理(基于 Microsoft.Web.WebView2)
前端·microsoft·wpf
Aevget1 天前
DevExpress WPF中文教程:Data Grid - 如何使用虚拟源?(二)
.net·wpf·界面控件·devexpress·ui开发·数据网格
大美B端工场-B端系统美颜师1 天前
工控软件开发选择难?Electron、Qt、WPF 对比
qt·electron·wpf
c#上位机2 天前
MefBootstrapper在Prism引导程序中的使用
c#·wpf·prism
没有bug.的程序员3 天前
服务治理与 API 网关:微服务流量管理的艺术
java·分布式·微服务·架构·wpf
Brianna Home3 天前
【案例实战】鸿蒙分布式调度:跨设备协同实战
华为·wpf·harmonyos