您的位置:首页 > 其它

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

2014-08-28 12:54 471 查看
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;
        }



内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: 
相关文章推荐