wpf 中的treeviewitem:基于数据初始化控件 数据动态加载 右键选中

14 篇文章 0 订阅

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;
        } 




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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值