[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类的对象为modelList<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;
相关文章推荐
- 浅析动态添加、删除、修改TreeView节点
- 动态修改TreeView某些节点TreeNode样式
- WPF给属性加动画后不能修改属性值解决方案
- 一个很苯的方法实现TreeView节点的动态添加
- TreeView中动态增加节点(ASP.NET2.0)
- WPF中展开一个TreeView控件的所有树节点
- TreeView 历遍与修改节点同级的所有节点,判断否有重复,处理方法:
- WPF中展开一个TreeView控件的所有树节点
- TreeView控件节点重命名后没有进入beginEdit的解决方案
- Henry手记-VB.NET中动态加载Treeview节点(二)
- 动态修改MasterPage 服务器端form的action属性
- WPF中展开一个TreeView控件的所有树节点
- WPF中展开一个TreeView控件的所有树节点
- VB.NET中动态加载Treeview节点
- javascript动态添加、修改、删除对象的属性和方法
- 利用TreeView.TreeNodePopulate 事件为TreeView动态增加节点
- Henry手记-VB.NET中动态加载Treeview节点(二)
- VB.NET中动态加载Treeview节点(二)
- 1.TreeView.应用--2.asp.net 2.0中TREEVIEW中动态增加结点--3.msdn中nasp.net 2.0中TREEVIEW中动态增加结点--4.TreeView.ImageSet 属性,换换treeview的皮肤
- dom4j修改节点属性及写入文件