public class TreeListView : TreeView
//这两个默认的是TreeViewItem
protected override DependencyObject GetContainerForItemOverride()//创建或标识用于显示指定项的元素。
return new TreeListViewItem();
protected override bool IsItemItsOwnContainerOverride(object item)//确定指定项是否是(或可作为)其自己的 ItemContainer
//return item is TreeListViewItem;
bool _isTreeLVI = item is TreeListViewItem;
return _isTreeLVI;
public class TreeListViewItem : TreeViewItem
/// <summary>
/// hierarchy
/// </summary>
public int Level
if (_level == -1)
TreeListViewItem parent =
ItemsControl.ItemsControlFromItemContainer(this) as TreeListViewItem;//返回拥有指定的容器元素中 ItemsControl 。
_level = (parent != null) ? parent.Level + 1 : 0;
return _level;
protected override DependencyObject GetContainerForItemOverride()
return new TreeListViewItem();
protected override bool IsItemItsOwnContainerOverride(object item)
//return item is TreeListViewItem;
bool _isITV = item is TreeListViewItem;
return _isITV;
private int _level = -1;
}
上边是对TreeView的重写,因为TreeView是有层级关系的我们做的重写就把它的层级返回来
我们还要有一个列宽的转换
/// <summary>
/// </summary>
public class LevelToIndentConverter : IValueConverter
public object Convert(object o, Type type, object parameter, CultureInfo culture)
return new Thickness((int)o * c_IndentSize, 0, 0, 0);
public object ConvertBack(object o, Type type, object parameter, CultureInfo culture)
throw new NotSupportedException();
private const double c_IndentSize = 25.0;
}
using System;
using System.Collections.Generic;
using System.Collections.ObjectModel;
using System.ComponentModel;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows;
using System.Windows.Controls;
using System.Windows.Data;
using System.Windows.Documents;
using System.Windows.Input;
using System.Windows.Media;
using System.Windows.Media.Imaging;
using System.Windows.Navigation;
using System.Windows.Shapes;
namespace TreeViewListDemoT
/// <summary>
/// MainWindow.xaml 的交互逻辑
/// </summary>
public partial class MainWindow : Window
public MainWindow()
InitializeComponent();
ObjForTest root = new ObjForTest();
ObjForTest depart = new ObjForTest("Department", null, "");
ObjForTest c1 = new ObjForTest( "li", 45, "M");
ObjForTest c2 = new ObjForTest( "xu", 30, "W");
ObjForTest c3 = new ObjForTest("zhang", 22, "M");
ObjForTest cc1 = new ObjForTest( "shen", 30, "M");
ObjForTest cc2 = new ObjForTest( "zhao", 18, "W");
ObjForTest cc3 = new ObjForTest( "wang", 32, "M");
ObjForTest ccc1 = new ObjForTest( "qian", 20, "W");
root.Children.Add(depart);
depart.Children.Add(c1);
depart.Children.Add(c2);
depart.Children.Add(c3);
c1.Children.Add(cc1);
c2.Children.Add(cc2);
c3.Children.Add(cc3);
cc1.Children.Add(ccc1);
this._list.ItemsSource = root.Children;
public class ObjForTest
public ObjForTest() { }
public ObjForTest( string name, int? age, string sex)
this._sex = sex;
this._age = age;
this._name = name;
private string _name;
private int? _age;
private string _sex;
public string Sex
get { return this._sex; }
set { this._sex = value; }
public int? Age
get { return this._age; }
set { this._age = value; }
public string Name
get { return _name; }
_name = value;
private ObservableCollection<ObjForTest> _children = new ObservableCollection<ObjForTest>();
public ObservableCollection<ObjForTest> Children
get { return _children; }