您的位置:首页 > 其它

[WPF]TreeView动态修改某个节点属性的解决方案

2014-09-24 16:13 417 查看

遇到的问题

有些时候需要修改TreeView中的某些节点的颜色,例如我现在做的搜索功能,搜索到符合要求的节点,就改变其背景色。TreeView的内容是直接通过一个对象集合绑定的,于是就不能像其他控件那样直接通过属性修改。

解决思路

以前为了解决
动态展开最后一个节点
时找到了以下一段代码

public static void ExpandLastNode(TreeView treeView)
{
if (treeView.Items.Count > 0)
{
var lastModel = treeView.Items[treeView.Items.Count - 1];
TreeViewItem currentContainer = treeView.ItemContainerGenerator.ContainerFromItem(lastModel) as TreeViewItem;
currentContainer.IsExpanded = true;
}
}


树的对象是这样定义的

class TreeModel
{
public TreeModel()
{
this.Nodes = new List<TreeModel>();
}
public Int32 ID { get; set; }
public Int32 PID { get; set; }
public String Name { get; set; }
public Int32? DiaID { get; set; }

public List<TreeModel> Nodes { get; set; }

}


我的这颗树只有两层,所以我只需要展开第一层的最后一个节点就完成了我的需求。首先
treeView.Items.Count
指的就是第一层总共的数量。也就是把最后一层的父节点对象,转换成TreeViewItem即可修改其属性值。

于是受到这一点的启发,我的想法是在TreeView的ItemSource找到需要改变背景色的对象,将其转换成TreeViewItem,再修改背景色属性就完成了需求。

解决过程

如何在TreeView找到需要的对象

我利用的是已知需要的对象的某个属性的不会重复的属性值,此处利用ID。已知需要查找的TreeModel类的对象为model

List<Model.TreeModel> listTreeView = tvSideBar.ItemsSource as List<Model.TreeModel>;
List<Model.TreeModel> listTreeSrc = new DAL.TreeDAL().ListAll().ToList();

Model.TreeModel nodeSrc = listTreeSrc.Find(delegate(Model.TreeModel t) { return t.DiaID == model.ID; });
Model.TreeModel tvModel = listTreeView.Find(delegate(Model.TreeModel t) { return t.ID == nodeSrc.PID; });
Model.TreeModel tvNodeModel = tvModel.Nodes.Find(delegate(Model.TreeModel t) { return t.DiaID == nodeSrc.DiaID; });


通过Find()方法就找到了需要的对象,tvModel为父节点,tvNodeModel为子节点

获得TreeView对应的节点

TreeViewItem currentContainer = tvSideBar.ItemContainerGenerator.ContainerFromItem(tvModel) as TreeViewItem;


TreeView有个问题,父节点没有展开的情况下是定位不到子节点的,所以这是时候利用上面的方法,在
currentContainer
内是
ContainerFromItem
不到其子节点的,必须通过下面方法

currentContainer.SetValue(TreeViewItem.IsExpandedProperty, true);
currentContainer.UpdateLayout();

TreeViewItem tvitem = currentContainer.ItemContainerGenerator.ContainerFromItem(tvNodeModel) as TreeViewItem;


展开父节点,接着利用UpdateLayout()更新UI就能找到子节点了。

修改背景色

tvitem.Background = System.Windows.Media.Brushes.IndianRed;
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签:  .net treeview wpf