今天在做一个项目时用到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}"/>
</HierarchicalDataTemplate>
</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、通过遍历可视树来判断层级