wpf之TreeView绑定

     wpf绑定TreeView,貌似比winForm可能要麻烦一些,不过仔细分析一下,还是很好解决的,最近做了一个项目,正好写了一下,下面把代码贴出来和大家分享一下

先看一个简单的绑定

View Code
 //代码绑定TreeView2
        private void BindTreeView2()
        {
            TreeViewItem item1 = new TreeViewItem() { Header = "节点一" };
            TreeViewItem item11 = new TreeViewItem() { Header = "节点1-1" };
            item11.Items.Add("aaaa");
            item11.Items.Add("bbbb");
            item11.Items.Add("cccc");
            item11.Items.Add("dddd");


            item1.Items.Add(item11);
            item1.Items.Add("cccc");
            item1.Items.Add("dddd");

            TreeViewItem item2 = new TreeViewItem() { Header = "节点二" };
            item2.Items.Add("aaaa");
            item2.Items.Add("bbbb");
            item2.Items.Add("cccc");
            item2.Items.Add("dddd");
            treeView2.Items.Add(item1);
            treeView2.Items.Add(item2);
        }

        private void treeView2_SelectedItemChanged(object sender, RoutedPropertyChangedEventArgs<object> e)
        {
            string dd = treeView2.SelectedItem as string;
            MessageBox.Show(dd);
        }

然后在看看动态绑定

首先、需要创建一个节点类,包括节点名称,图片,内容等,另外为了可以增加子节点,在加一个泛型IList,类型就是节点类本身

 

View Code
///   <summary>
    
///  节点类
    
///   </summary>
     internal  class PropertyNodeItem
    {
         public  string Icon {  getset; }
         public  string EditIcon {  getset; }
         public  string DisplayName {  getset; }
         public  string Name {  getset; }
         public  int id {  getset; }
         public  int parentId{ get; set;}
         public  bool IsExpanded {  getset; }
         public List<PropertyNodeItem> Children {  getset; }
         public PropertyNodeItem()
        {
            Children =  new List<PropertyNodeItem>();
        }
    }

 

然后从数据库中读取根节点绑定到treeView中

 

View Code
  WebDictClassServices.WebDictClass webDict =  new WebDictClass();
         // 根节点添加到treeVIew中
         private  void loadTree()
        {
            tvProperties.Items.Clear(); // 加载根节点前先清除Treeview控件项
            List<PropertyNodeItem> itemList =  new List<PropertyNodeItem>();
            DataTable  dt=webDict.GetArticles();
            DataView dv = dt.DefaultView;
            dv.RowFilter =  "  ClassType='3' and ParentId=0  ";
            PropertyNodeItem node =  new PropertyNodeItem()
            {
                DisplayName = dv[ 0].Row[ " title "].ToString(),
                Name = dv[ 0].Row[ " title "].ToString(),
                id=Convert.ToInt32(dv[ 0].Row[ " id "].ToString()),
                parentId=Convert.ToInt32(dv[ 0].Row[ " ParentId "].ToString()),
                IsExpanded= true
                
            };
             int id =Convert.ToInt32(dv[ 0][ " id "].ToString());
             int pid = Convert.ToInt32(dv[ 0][ " ParentId "].ToString());
            ForeachPropertyNode(node, id);
            itemList.Add(node);
            
             this.tvProperties.ItemsSource = itemList;
        }

 

然后,在 ForeachPropertyNode方法中,实现了无限极节点

 

View Code
  // 无限接循环子节点添加到根节点下面
         private  void ForeachPropertyNode(PropertyNodeItem node, int pid)
        {
            DataTable dtDict = webDict.GetArticles();
            DataView dvDict = dtDict.DefaultView;
            dvDict.RowFilter =  "  ClassType='3' and ParentId= " + pid;

             if (dvDict.Count >  0)
            {
                 foreach (DataRowView view  in dvDict)
                {
                     int id = Convert.ToInt32(view[ " id "].ToString());
                     string name = view[ " title "].ToString();
                     int parentId = Convert.ToInt32(view[ " ParentId "].ToString());
                    PropertyNodeItem childNodeItem =  new PropertyNodeItem()
                    {
                        DisplayName = name,
                        Name = name,
                        id=id,
                        parentId=parentId,
                        IsExpanded= false
                    };
                    ForeachPropertyNode(childNodeItem, id);
                    node.Children.Add(childNodeItem);
                }
            }
          
        }

如果我们想触发点击节点事件

 

View Code
       // 选中节点事件
         private  void tvProperties_SelectedItemChanged( object sender, RoutedPropertyChangedEventArgs< object> e)
        {
            PropertyNodeItem item =  this.tvProperties.SelectedItem  as PropertyNodeItem;
             string nodeText= item.Name;

           //   MessageBox.Show(nodeText);
            
        }

 

前台的xaml文件

 

  < TreeView  Height ="264"  x:Name ="tvProperties"  Width ="220"  SelectedItemChanged ="tvProperties_SelectedItemChanged" >
                 < TreeView.ItemContainerStyle >
                     < Style  TargetType =" {x:Type TreeViewItem} " >
                         < Setter  Property ="IsExpanded"  Value =" {Binding IsExpanded} " ></ Setter >
                     </ Style >
                 </ TreeView.ItemContainerStyle >
                     < TreeView.ItemTemplate >
              
                     < HierarchicalDataTemplate   ItemsSource =" {Binding Path=Children} " >
                        
                         < StackPanel  Orientation ="Horizontal" >
                          
                             < Image  VerticalAlignment ="Center"  Source =" {Binding Icon} "  Width ="16"  Height ="16"  Margin ="0,0,2,2" ></ Image >

                             < TextBlock  VerticalAlignment ="Center"  Name ="nodeName"  Text =" {Binding DisplayName} " ></ TextBlock >
                          
                             < Image  VerticalAlignment ="Center"  Source =" {Binding EditIcon} "  Margin ="2,0,0,0" ></ Image >
                          
                             < StackPanel.ToolTip >
                               
                                 < TextBlock  VerticalAlignment ="Center"  Text =" {Binding Name} "  TextWrapping ="Wrap"  MaxWidth ="200"   ></ TextBlock >
                               
                             </ StackPanel.ToolTip >
                           
                         </ StackPanel >
                      
                     </ HierarchicalDataTemplate >
                
                 </ TreeView.ItemTemplate >
             </ TreeView >

 可以发现,我们绑定的节点是类型的,到时候都可以转化过去,从而取得相关的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值