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

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


    }


 

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值