WPF TreeView自定义数据模板展开到指定层

来源:互联网 发布:数据正态分布说明什么 编辑:程序博客网 时间:2024/06/03 20:28

           TreeView 全部展开还是挺方便的只需设置TreeViewItem 样式即可全部展开,但展开到具体某一级就需要手工代码实现。如果TreeView 没有自定义数据模板 节点继承TreeViewItem 那么树的展开可以参考 MSDN博客  点击打开链接

public static class ExtensionMethods{  public static void ExpandAll(this System.Windows.Controls.TreeView treeView)  {   ExpandInternal(treeView);   }                                                                                                                                 
private static void ExpandInternal(ItemsControl targetItemContainer){  if (targetItemContainer == null) return;  if (targetItemContainer.Items == null) return;  for (int i = 0; i < targetItemContainer.Items.Count; i++)  {    TreeViewItem treeItem = targetItemContainer.Items[i] as TreeViewItem;    if (treeItem == null) continue;   if (!treeItem.HasItems) continue;    treeItem.IsExpanded = true;    ExpandInternal(treeItem);  } }} 


一、设置样式全部展开

 <UserControl.Resources>        <Style TargetType="{x:Type TreeViewItem}">            <Setter Property="IsExpanded" Value="True" /> <!-- 设置IsExpanded 为True 即全部展开-->        </Style>    </UserControl.Resources>        <DockPanel LastChildFill="True">        <TreeView x:Name="treeView1" x:FieldModifier="private"  BorderBrush="{x:Null}">                      <TreeView.ItemTemplate>                <HierarchicalDataTemplate DataType="{x:Type local:CompanyNodeItem}" ItemsSource="{Binding Children}" >                    <TextBlock VerticalAlignment="Center" Text="{Binding CompanyName}"  TextWrapping="Wrap" MaxWidth="200" />      </HierarchicalDataTemplate>            </TreeView.ItemTemplate>        </TreeView>    </DockPanel>


二、利用绑定机制实现展开到具体某一级

<TreeView x:Name="treeView1" x:FieldModifier="private"  BorderBrush="{x:Null}">            <TreeView.ItemContainerStyle>                <Style TargetType="{x:Type TreeViewItem}">                    <Setter Property="IsExpanded" Value="{Binding Expand}" />                    <!--是否展开绑定Expand 属性  后台代码设置Expand true false 即可展开到某一级-->                </Style>            </TreeView.ItemContainerStyle>            <TreeView.ItemTemplate>                <HierarchicalDataTemplate DataType="{x:Type local:CompanyNodeItem}" ItemsSource="{Binding Children}" >                    <TextBlock VerticalAlignment="Center" Text="{Binding CompanyName}" TextWrapping="Wrap" MaxWidth="200" />       </HierarchicalDataTemplate>            </TreeView.ItemTemplate>        </TreeView>


 

 节点对象

  public class CompanyNodeItem    {        public int CompanyId { set; get; }        public string CompanyName { set; get; }        public int ParentId { set; get; }        public List<CompanyNodeItem> Children { set; get; }        public bool Expand { set; get; }        public CompanyNodeItem()        {            Children = new List<CompanyNodeItem>();        }    }


 

        /// <summary>        /// 展开树节点到某一级 递归算法                                                                                                      /// <param name="list">构建树的所有节点集合</param>        /// <param name="lev"></param>        private void ExpandInternal(List<CompanyNodeItem> list, int lev)        {            if (lev > 3)  //展开到第三层                return;            list.ForEach(s => ExpandInternal(s.Children, lev + 1));                      list.ForEach(s=>s.Expand=true);        }


完整后台代码包括树的创建:

 

  public partial class WPFCompanyTree : UserControl    {        private List<CompanyNodeItem> listNode;        /// <summary>        /// WPFCompanyTree 选择的列改变引发的事件        /// </summary>        public event Action<object, CompanyNodeItem> WPFCompanyTreeSelectedItemChanged;        private List<CompanyNodeItem> listExpandNode;        public WPFCompanyTree()        {            InitializeComponent();            this.treeView1.SelectedItemChanged += treeView1_SelectedItemChanged;            InitDbData();            listExpandNode = InitTreeData();            treeView1.ItemsSource = listExpandNode;            ExpandInternal(listExpandNode, 1);        }        void treeView1_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)        {            if (WPFCompanyTreeSelectedItemChanged != null)                WPFCompanyTreeSelectedItemChanged(sender, treeView1.SelectedItem as CompanyNodeItem);        }        private void InitDbData()        {            DataTable dt = SqlClass.GetTable(@"SELECT [CID]                  ,[CName]                       ,[CParentID]                      FROM [jq.666gps.com].[dbo].[XFJCompany]");            int count = dt.Rows.Count;            listNode = new List<CompanyNodeItem>();            for (int i = 0; i < count; i++)            {                listNode.Add(new CompanyNodeItem() { CompanyId = Convert.ToInt32(dt.Rows[i][0]),                                            CompanyName = dt.Rows[i][1].ToString(), ParentId = Convert.ToInt32(dt.Rows[i][2]) });            }        }        private List<CompanyNodeItem> InitTreeData()        {            List<CompanyNodeItem> nodes = new List<CompanyNodeItem>();            listNode.ForEach(s =>            {                if (s.ParentId == 0)                {                    nodes.Add(s);                }                else                {                    CompanyNodeItem temp = NextFindNode(listNode, s.ParentId);                    if (temp != null)                    {                        temp.Children.Add(s);                    }                }            });            return nodes;        }        private CompanyNodeItem NextFindNode(List<CompanyNodeItem> list, int id)        {            if (list == null)                return null;            foreach (CompanyNodeItem node in list)            {                if (node.CompanyId == id)                    return node;                CompanyNodeItem temp = NextFindNode(node.Children, id);                if (temp != null)                    return temp;            }            return null;        }        /// <summary>        /// 展开树节点到某一级        /// </summary>        /// <param name="list">构建树的所有节点集合</param>        /// <param name="lev"></param>        private void ExpandInternal(List<CompanyNodeItem> list, int lev)        {            if (lev > 3)  //展开到第三层                return;            list.ForEach(s => ExpandInternal(s.Children, lev + 1));                      list.ForEach(s=>s.Expand=true);        }    }


 

 

原创粉丝点击