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

来源:互联网 发布:涟源行知中学吧 编辑:程序博客网 时间:2024/06/06 12:27

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
原创粉丝点击