在功能研发时,需要使用属性结构让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>();
}
}