1.首先定义数据类型
public class department
{
public int id { get; set; }
public string departName { get; set; }
public int parentDepartID { get; set; }
public List<department> listChildDepart { get; set; }
}
2.构造数据,加载到 List<departmen> 中
假设全局list名为 listDepartment.
listDepartment.Add(new department() { id = 1, departName = "顶级部门名称", listChildDepart = null, parentDepartID = 1 });
listDepartment.Add(new department() { id = 2, departName = "子级部门1", listChildDepart = null, parentDepartID = 1 });
listDepartment.Add(new department() { id = 3, departName = "子级部门1", listChildDepart = null, parentDepartID = 1 });
3.将数据格式化,即填充 department中的 listChildDepart 字段
//构造list数据, 元素为树形顶层的department
List<department> showList = new List<department>();
department top_department = updateDepartment(firstDepart);
if (top_department != null)
{
showList.Add(top_department);
}
上述定义的updateDepartment ,是一个递归方法,作用是填充 department中的子节点
代码为:
//递归更新一个list的子元素
private department updateDepartment(department depart)
{
List<department> list_child = listDepart.FindAll(p => p.id != p.parentDepartID && p.parentDepartID == depart.id); //下级的所有 department
if (list_child != null && list_child.Count > 0)
{
depart.listChildDepart = new List<department>();
foreach (department tmp in list_child)
{
depart.listChildDepart.Add(updateDepartment(tmp));
}
}
return depart;
}
4.给treeview定义xaml模板
<TreeView Background="Transparent" Width="600" HorizontalAlignment="Left" Margin="100,0,0,0" Name="treeView1" TreeViewItem.PreviewMouseRightButtonDown="TreeViewItem_PreviewMouseRightButtonDown" BorderThickness="0">
<TreeView.ItemTemplate >
<HierarchicalDataTemplate ItemsSource="{Binding listChildDepart}" >
<Grid ContextMenu="{StaticResource sampleContextMenu}" >
<Grid.ColumnDefinitions>
<ColumnDefinition Width="18"></ColumnDefinition>
<ColumnDefinition Width="100"></ColumnDefinition>
</Grid.ColumnDefinitions>
<Image Source="/Manager;component/images/small.jpg" Width="7" Height="7"></Image>
<TextBlock Grid.Column="1" Text="{Binding departName}" />
</Grid>
</HierarchicalDataTemplate>
</TreeView.ItemTemplate>
</TreeView>
5.给控件指定数据源,完成绑定。
treeView1.ItemsSource = showList;
ExpandAll(treeView1);
6.上述的ExpandAll方法为了实现展开treeview的所有子节点,代码参考博友的内容:
public void ExpandAll(TreeView treeView)
{
List<TreeViewItem> list = GetChildObjects<TreeViewItem>(treeView, "");
foreach (TreeViewItem tvi in list)
{
tvi.ExpandSubtree();
}
}
/// <summary>
/// 查找控件树下的元素集合
/// </summary>
/// <typeparam name="T"></typeparam>
/// <param name="obj"></param>
/// <param name="name"></param>
/// <returns></returns>
public List<T> GetChildObjects<T>(DependencyObject obj, string name) where T : FrameworkElement
{
DependencyObject child = null;
List<T> childList = new List<T>();
for (int i = 0; i <= VisualTreeHelper.GetChildrenCount(obj) - 1; i++)
{
child = VisualTreeHelper.GetChild(obj, i);
if (child is T && (((T)child).Name == name || string.IsNullOrEmpty(name)))
{
childList.Add((T)child);
}
childList.AddRange(GetChildObjects<T>(child, ""));//指定集合的元素添加到List队尾
}
return childList;
}
7. 右键点击的实现,同样参考了博友的博客
private void TreeViewItem_PreviewMouseRightButtonDown(object sender, MouseButtonEventArgs e)
{
var treeViewItem = VisualUpwardSearch<TreeViewItem>(e.OriginalSource as DependencyObject) as TreeViewItem;
if (treeViewItem != null)
{
treeViewItem.Focus();
e.Handled = true;
}
}
//向上查找,指导找到所属的treeviewitem
static DependencyObject VisualUpwardSearch<T>(DependencyObject source)
{
while (source != null && source.GetType() != typeof(T))
source = VisualTreeHelper.GetParent(source);
return source;
}