WPF TreeView控件获取节点等级和父节点

72 篇文章 9 订阅

今天在做一个项目时用到TreeView控件,想通过双击子节点对选中节点进行一些处理,发现并没有想象中的那么简单,于是就只能自己想办法去实现了(网上搜了一些方法,不是很靠谱,重要的是不够简洁【坏笑】)

一、获取选中节点的父节点(容器)

1、当节点不是通过数据源绑定生成时,比较简单。

private void TreeView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
        {
            TreeView treeView = sender as TreeView;
            TreeViewItem treeViewItem = (TreeViewItem)treeView.SelectedItem;
            if (treeViewItem != null)
            {
                DependencyObject dp = treeViewItem.Parent;
                if (dp.GetType().Name == "TreeView")
                {
                    Console.WriteLine("TreeView");
                }
                else if (dp.GetType().Name == "TreeViewItem")
                {
                    Console.WriteLine("TreeViewItem");
                }
            }
        }

因获取的父类可能是个TreeView,也可能是个TreeViewItem,所以对类型做了一个判断。

2、当节点是由数据源绑定生成时,需要通过可视树来获取父节点。

private void TreeView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var item = e.OriginalSource as FrameworkElement;
    if (item != null)
    {
        int count = 0;
        DependencyObject parent = item;
        do
        {
            parent = VisualTreeHelper.GetParent(parent);
            if (parent is TreeViewItem)
            {
                if (count > 0)
                {
                    Console.WriteLine("父级节点是个TreeViewItem");
                    break;
                }
                count++;
            }
            else if (parent is TreeView)
            {
                Console.WriteLine("父级节点是个TreeView");
                break;
            }
        }
        while (parent != null);
    }
}

二、判断当前节点的层级
这个在Winform开发的时候很容易获取,因为TreeNode有这个属性,但是WPF的TreeViewItem没有提供这个属性,我们只能自己实现了。

1、通过遍历可视树来实现

private void TreeView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    var item = e.OriginalSource as FrameworkElement;
    if (item != null)
    {
        int count = 0;
        DependencyObject parent = item;
        do
        {
            parent = VisualTreeHelper.GetParent(parent);
            if (parent is TreeViewItem)
            {
                count++;
            }
            else if (parent is TreeView)
            {
                Console.WriteLine($"当前节点层级={count}");
            }
        }
        while (parent != null);
    }
}

2、通过构建ViewModel来实现(一般用于节点由DataTemplate生成的情况)
首先,我们构建一个数据源,用来绑定TreeView
数据源定义如下:

 public class TreeViewNode
    {
        public int Level { get; set; }
        public string Name { get; set; }
        public IList<TreeViewNode> Children { get; set; }
    }

这里的Level就是我们要获取的层级属性,接下来绑定数据源。
首先要在XAML代码里设置TreeView的ItemTemplate属性

<TreeView.ItemTemplate>
	<HierarchicalDataTemplate ItemsSource="{Binding Children}">
		<TextBlock Text="{Binding Name}" />
	</HierarichiclDataTemplate>
</TreeView.ItemTemplate>

接着在构造函数或窗体加载事件中绑定数据源(注意:绑定数据源就不能手动添加节点!)

public Window1()
        {
            InitializeComponent();

            TreeViewNode treeViewNode = new TreeViewNode()
            {
                Level = 1,
                Name = "一级",
                Children = new List<TreeViewNode>()
                {
                    new TreeViewNode()
                    {
                        Level = 2,
                        Name = "二级"
                    },
                    new TreeViewNode()
                    {
                        Level = 2,
                        Name = "二级"
                    }
                }
            };

            treeView.ItemsSource = new List<TreeViewNode> { treeViewNode };
        }

下面就是如何获取数据源中的层级了:

private void TreeView_MouseDoubleClick(object sender, MouseButtonEventArgs e)
{
    TreeView treeView = sender as TreeView;
    TreeViewNode selectedNode = (TreeViewNode)treeView.SelectedItem;
    if (selectedNode != null)
    {
        Console.WriteLine(selectedNode.Level); 
    }
}

获取的过程非常简单,你也可以在数据源中加入更多想获得的属性。

2、通过遍历可视树来判断层级

  • 0
    点赞
  • 1
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值