WPF Treeview绑定Revit数据

编程入门 行业动态 更新时间:2024-10-13 04:19:00

WPF Treeview<a href=https://www.elefans.com/category/jswz/34/1769902.html style=绑定Revit数据"/>

WPF Treeview绑定Revit数据

本文参照
作者:SmlAnt
  出处:
  注意:转载请保留以上内容,并标作者和出处。

  文章有很多有很多有用的知识点
在制作功能需求是需要用到Treeview命令,而且在制作过程中发现TreeView的层次架构符合Revit的层次结构,能够让数据更加清晰的显示出来。
public class TreeNode : INotifyPropertyChanged
{
public event PropertyChangedEventHandler PropertyChanged;

        /// <summary>/// 监听属性改变事件/// </summary>/// <param name="info"></param>private void NotifyProperChanged(string info){if (PropertyChanged != null){PropertyChanged(this, new PropertyChangedEventArgs(info));}}#region 基本数据public double ParentId { get; set; }public string ElementName { get; set; }public double Id { get; set; }public ElementId ElementId { get; set; }private bool? _IsChecked;/// <summary>/// ParentNode/// </summary>public TreeNode Parent { get; set; }#endregion/// <summary>/// 构造/// </summary>public TreeNode(List<TreeNode> Nodes){_IsChecked = false;ParentNodes = GetChildNodes(0, Nodes);}public TreeNode(){_IsChecked = false;}/// <summary>/// creat a ChildNode/// </summary>public List<TreeNode> ChildrenNode { get; set; }/// <summary>/// 是否选中/// </summary>public bool? IsChecked{get { return _IsChecked; }set{if (value != _IsChecked){_IsChecked = value;if (IsChecked == true){ChangeChildNodes(this);ChangeParentNodes(this);NotifyProperChanged("IsChecked");}}}}/// <summary>/// 设置全选/// </summary>/// <param name="isChecked"></param>public void SetChildrenChecked(bool? isChecked){foreach (TreeNode child in ChildrenNode){child.IsChecked = IsChecked;child.SetChildrenChecked(IsChecked);}}private List<TreeNode> parentNodes = new List<TreeNode>();public List<TreeNode> ParentNodes{get { return parentNodes; }set{parentNodes = value;if (PropertyChanged != null)PropertyChanged(this, new PropertyChangedEventArgs("ParentNodes"));}}/// <summary>/// 递归算法求树形数据/// </summary>/// <param name="parenId"></param>/// <param name="nodels"></param>/// <returns></returns>private List<TreeNode> GetChildNodes(double parenId, List<TreeNode> nodels){List<TreeNode> mainDatas = nodels.Where(t => t.ParentId == parenId).ToList<TreeNode>();List<TreeNode> secondDatas = nodels.Where(t => t.ParentId != parenId).ToList<TreeNode>();foreach (TreeNode fd in mainDatas){fd.ChildrenNode = GetChildNodes(fd.Id, secondDatas);}return mainDatas;}private void ChangeChildNodes(TreeNode treeNode){if (treeNode.ChildrenNode != null){foreach (var data in treeNode.ChildrenNode){data.IsChecked = true;data.NotifyProperChanged("IsChecked");if (data.ChildrenNode != null){data.ChangeChildNodes(data);}}}}/// <summary>/// 向下遍历,更改子节点状态/// </summary>/// <param name="treeNode"></param>public void ChangeParentNodes(TreeNode treeNode){if (treeNode.Parent != null){bool? parentChecked = true;int selectedCount = 0;//被选中个数int noSelectedCount = 0;//未被选中个数foreach (var data in treeNode.Parent.ChildrenNode){if (data.IsChecked == true){selectedCount++;}else if (data.IsChecked == false){noSelectedCount++;}}//如果被全部选中,则父节点为选中if (selectedCount == treeNode.Parent.ChildrenNode.Count){parentChecked = true;}else if (noSelectedCount == treeNode.Parent.ChildrenNode.Count){parentChecked = false;}else{parentChecked = null;}treeNode.Parent.IsChecked = parentChecked;treeNode.Parent.NotifyProperChanged("IsChecked");if (treeNode.Parent.Parent != null){ChangeParentNodes(treeNode.Parent);}}}}

其中递归部分和自上而下的代码还是不太懂,等以后慢慢琢磨吧!

更多推荐

WPF Treeview绑定Revit数据

本文发布于:2024-02-06 08:20:52,感谢您对本站的认可!
本文链接:https://www.elefans.com/category/jswz/34/1747481.html
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系,我们将在24小时内删除。
本文标签:绑定   数据   WPF   Treeview   Revit

发布评论

评论列表 (有 0 条评论)
草根站长

>www.elefans.com

编程频道|电子爱好者 - 技术资讯及电子产品介绍!