本文参照
作者:SmlAnt
  出处:http://www.cnblogs.com/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);
                }
            }
        }

    }

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