WPF revit二次开发使用树形结构显示revit数据

在功能研发时,需要使用属性结构让revit本身的数据结构更加的清晰,再写代码时采用了mvvm模式对,将数据采集整理再后端完成。利用递归的方式将整个层级进行分类。
本文参照了:https://www.cnblogs.com/yeyunfei/p/5408931.html
https://www.jianshu.com/p/908070cca109
https://www.cnblogs.com/larissa-0464/p/10227483.html
的案例。
xaml代码:

<TreeView Name="TreeView" ItemsSource="{Binding TreeNodes}" HorizontalAlignment="Left" Height="325" Margin="25,60,0,0" VerticalAlignment="Top" Width="220">
            <TreeView.ItemTemplate>
                <HierarchicalDataTemplate  ItemsSource="{Binding Path= Nodes}">
                    <TextBlock Text="{Binding ElementName}"></TextBlock>
                </HierarchicalDataTemplate>
            </TreeView.ItemTemplate>
        </TreeView>

xaml.cs代码:

  public MainWindow(List<Command.TreeNode> fds)
        {
            InitializeComponent();
            Datas = fds;

            TreeView.DataContext = new WindowData();

        }
        
        public class WindowData : INotifyPropertyChanged
        {
            public event PropertyChangedEventHandler PropertyChanged;
            private List<Command.TreeNode> treeNodes = new List<Command.TreeNode>();

            public List<Command.TreeNode> TreeNodes
            {
                get { return treeNodes; }
                set
                {
                    treeNodes = value;
                    if (PropertyChanged != null)
                        PropertyChanged(this, new PropertyChangedEventArgs("TreeNodes"));
                }
            }
            public WindowData()
            {
                TreeNodes = GetFamilyData(0, Datas);
            }

            private List<Command.TreeNode> GetFamilyData(double parenId, List<Command.TreeNode> datas)
            {
                List<Command.TreeNode> mainDatas = datas.Where(t => t.ParentId == parenId).ToList<Command.TreeNode>();
                List<Command.TreeNode> secondDatas = datas.Where(t => t.ParentId != parenId).ToList<Command.TreeNode>();
                foreach (Command.TreeNode fd in mainDatas)
                {
                    fd.Nodes = GetFamilyData(fd.Id, secondDatas);
                }

                return mainDatas;
            }
        }

后端处理数据代码,感觉自动处理代码有点复杂,后期进行优化:

private List<TreeNode> GetTreeNodes(List<FamilyData> fds)
        {
            // The First ID 
            int v = 1;
            List<TreeNode> treeNodes = new List<TreeNode>();
            for (int i = 0; i < fds.Count; i++)
            {
                TreeNode tn = new TreeNode();
                tn.Id = v;
                tn.ParentId = 0;
                tn.ElementName = fds[i].Category.Name;
                v++;
                treeNodes.Add(tn);
                foreach (var dic in fds[i].FamilyAndSymbol)
                {
                    TreeNode tn2 = new TreeNode();
                    tn2.ParentId = tn.Id;
                    tn2.Id = v;
                    v++;
                    tn2.ElementName = dic.Key.Name;
                    treeNodes.Add(tn2);
                    foreach (FamilySymbol sym in dic.Value)
                    {
                        TreeNode tn3 = new TreeNode();
                        tn3.ParentId = tn2.Id;
                        tn3.Id = v;
                        tn3.ElementName = sym.Name;
                        v++;
                        treeNodes.Add(tn3);
                    }
                }
                
            }

            return treeNodes;
        }

数据结构:

   public class TreeNode
        {
            public double ParentId { get; set; }
            public string ElementName { get; set; }
            public double Id { get; set; }
            public ElementId ElementId { get; set; }
            public List<TreeNode> Nodes { get; set; }

            public TreeNode()
            {
                Nodes = new List<TreeNode>();
            }
        }
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值