wpf 中的treeviewitem:基于数据初始化控件 数据动态加载 右键选中
2014-08-28 12:54
471 查看
1.首先定义数据类型
2.构造数据,加载到 List<departmen> 中
假设全局list名为 listDepartment.
3.将数据格式化,即填充 department中的 listChildDepart 字段
上述定义的updateDepartment ,是一个递归方法,作用是填充 department中的子节点
代码为:
4.给treeview定义xaml模板
5.给控件指定数据源,完成绑定。
6.上述的ExpandAll方法为了实现展开treeview的所有子节点,代码参考博友的内容:
7. 右键点击的实现,同样参考了博友的博客
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; }
相关文章推荐
- WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
- Silverlight Telerik控件学习:TreeView数据绑定并初始化选中状态、PanelBar的Accordion效果、TabPanel、Frame基本使用
- web页面动态加载UserControl,并调用用户控件中的方法来初始化控件
- treeview控件(动态数据绑定+整行选择)(WPF)(一)
- VS2010 c# winform中datagridview控件初次加载时去除默认选中第一行数据
- Jquery chosen动态设置值 select Ajax动态加载数据 设置chosen和获取他们选中的值
- dh: 实现iframe 自适应高度的问题(初始化和动态加载数据的时候)
- C# checklistbox控件用法总结(怎样得到多选的值,以及动态加载数据)
- WPF 后台代码 动态加载 UserControl控件
- WPF: WrapPanel 容器的数据绑定(动态生成控件、遍历)
- MFC 基于对话框的图片控件(picture)动态加载.bmp图片并显示
- 测试WPF中动态加载XAML中的控件
- C# checklistbox控件用法总结(怎样得到多选的值,以及动态加载数据)
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- WPF中动态加载XAML中的控件
- 总结Asp.net中Page加载PostData的具体过程 进而解决"获取动态创建的控件的PostData数据"问题
- SolpartMenu的使用:(二)、在ASP.NET页面中使用SolpartMenu控件之动态的加载数据库中的数据来生成菜单
- WPF如何后台动态添加控件的右键菜单
- 实现虚拟模式的动态数据加载Windows窗体DataGridView控件 .net 4.5 (一)
- Jquery chosen动态设置值实例介绍 select Ajax动态加载数据 设置chosen和获取他们选中的值