WPF Treeview绑定Revit数据
仅提供中文版本
本文参照
作者: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);
}
}
}
}
其中递归部分和自上而下的代码还是不太懂,等以后慢慢琢磨吧!
All articles on this blog are licensed under CC BY-NC-SA 4.0 unless otherwise stated.




