wpf之TreeView绑定

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

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

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

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

 //根节点添加到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方法中,实现了无限极节点

 //无限接循环子节点添加到根节点下面
        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);
                }
            }
          
        }

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

      //选中节点事件
        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>

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


  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 4
    评论
WPFTreeView 控件支持多级绑定,可以实现多级数据的显示。下面是一个简单的示例,演示了如何实现多级绑定TreeView。 假设我们有一个类 Category,它有一个 Name 属性和一个 Children 属性,Children 属性是一个 Category 类型的列表,表示当前分类的子分类。我们可以通过递归的方式来实现多级绑定TreeView。 ```csharp public class Category { public string Name { get; set; } public List<Category> Children { get; set; } } ``` 在 XAML 中,我们可以使用 HierarchicalDataTemplate 来定义 TreeView 的数据模板。下面是一个示例: ```xaml <TreeView ItemsSource="{Binding Categories}"> <TreeView.ItemTemplate> <HierarchicalDataTemplate ItemsSource="{Binding Children}"> <TextBlock Text="{Binding Name}" /> </HierarchicalDataTemplate> </TreeView.ItemTemplate> </TreeView> ``` 在这个示例中,我们使用 HierarchicalDataTemplate 来定义 TreeView 的数据模板。ItemsSource 属性绑定到 Categories 属性,表示 TreeView 的根节点是 Categories 列表中的所有分类。HierarchicalDataTemplate 的 ItemsSource 属性绑定到 Children 属性,表示当前分类的子分类是 Children 列表中的所有分类。TextBlock 的 Text 属性绑定到 Name 属性,表示当前分类的名称是 Name 属性的值。 通过这种方式,我们可以很方便地实现多级绑定TreeView。如果需要更复杂的数据模板,可以在 HierarchicalDataTemplate 中添加更多的控件和绑定
评论 4
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值