WPF 目录树绑定 与 遍历

定义树节点,(编译环境VS2017)

    public class GBTreeNode : INotifyPropertyChanged
    {
        private string _deviceId = string.Empty;
        private string _name = string.Empty;
        private string _parentId = string.Empty;
        private ImageSource _imageSource = null;
        private ObservableCollection<GBTreeNode> _Nodes = new ObservableCollection<GBTreeNode>();    
        public string DeviceId
        {
            set => UpdateProperty(ref _deviceId, value);
            get => _deviceId;
        }
        public string Name
        {
            set => UpdateProperty(ref _name, value);
            get => _name;
        }
        public string ParentId
        {
            set => UpdateProperty(ref _parentId, value);
            get => _parentId;
        }
        public ImageSource ImageSource
        {
            set => UpdateProperty(ref _imageSource, value);
            get => _imageSource;
        }
        public ObservableCollection<GBTreeNode> Nodes
        {
            set => UpdateProperty(ref _Nodes, value);
            get => _Nodes;
        }
                public void UpdateProperty<T>(ref T properValue, T newValue, [CallerMemberName] string propertyName = "")
        {
            if (object.Equals(properValue, newValue))
            {
                return;
            }
            properValue = newValue;

            OnPropertyChanged(propertyName);
        }
        public event PropertyChangedEventHandler PropertyChanged;
        protected void OnPropertyChanged([CallerMemberName]string propertyName = "")
        {
            PropertyChangedEventHandler handler = PropertyChanged;
            if (handler != null)
            {
                handler(this, new PropertyChangedEventArgs(propertyName));
            }
        }
}

  xmal 前端代码:  localCatalog 绑定的树结构

    <UserControl.Resources>
        <HierarchicalDataTemplate x:Key="TreeViewTemplate" DataType="{x:Type mode:GBTreeNode}" ItemsSource="{Binding Nodes, Mode=TwoWay}">
            <StackPanel Orientation="Horizontal" Margin="0,2,0,2">
                <Image Source="{Binding ImageSource , Mode=TwoWay}" Width="16" Height="16" />
                <Label Width="5" Opacity="0"></Label>
                <TextBlock Text="{Binding Name, Mode=TwoWay}" ToolTip="{Binding Name, Mode=TwoWay}" FontSize="12"/>
            </StackPanel>
        </HierarchicalDataTemplate>
    </UserControl.Resources>
    <TreeView Background="#DBDDE1" ItemTemplate="{StaticResource ResourceKey=TreeViewTemplate}" BorderThickness="1" 
BorderBrush="Red" ItemsSource="{Binding Path=localCatalog}" Margin="10,0,0,0" />

  Tips: 编译的时候 DataType="{x:Type mode:GBTreeNode}" 此段代码会出错, 需要在xmal头添加GBTreeNode所在命名空间

    xmlns:mode="clr-namespace:XXXXXXXXXXX"

  CS中的后台代码: 生成目录树结构

        public ObservableCollection<GBTreeNode> localCatalog = new ObservableCollection<GBTreeNode>();
        localCatalog  = Bind(所有的树节点);
        //绑定树
        private ObservableCollection<GBTreeNode> Bind(ObservableCollection<GBTreeNode> nodes)
        {
            ObservableCollection<GBTreeNode> outputList = new ObservableCollection<GBTreeNode>();
            for (int i = 0; i < nodes.Count; i++)
            {
                if (FindDownward(nodes,  nodes[i].ParentId) != null)
                {
                    FindDownward(nodes, nodes[i].ParentId).Nodes.Add(nodes[i]);
                }
                else //找不到父节点,此节点就为根节点
                {
                    outputList.Add(nodes[i]);
                }
            }
            return outputList;
        }
        //向下查找
        private GBTreeNode FindDownward(ObservableCollection<GBTreeNode> nodes, string ParentId)
        {
            if (nodes.Count == 0) return null;
            for (int i = 0; i < nodes.Count; i++)
            {
                if (nodes[i].DeviceId.Equals(ParentId))
                {
                    return nodes[i];
                }
                GBTreeNode node = FindDownward(nodes[i].Nodes, ParentId);
                if (node != null)
                {
                    return node;
                }
            }
            return null;
        }    

  CS后台代码: 遍历目录树结构

  

    //nodes: 创建好的树结构  list: 保存树所有的树节点
    private void RecurPackageTreeNodeXml(ObservableCollection<GBTreeNode> nodes, List<CatalogConfigItemType> list)
        {
            if (nodes.Count == 0) return;
            foreach (GBTreeNode item in nodes)
            {
                    /*
            业务代码 */ RecurPackageTreeNodeXml(item.Nodes, list); list.Add(itemNode); } }

  

  

  

转载于:https://www.cnblogs.com/hul201610101100/p/8024252.html

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值