WPF 中的 TreeView 选中 指定 节点
基本原理TreeView节点一般包装了一个自定义的对象,这个对象包含ID、DisplayName等各类属性。我的一个项目里有TreeView加载后默认选中根节点,或者运行中后台指定选中某个节点的需求。比如对节点进行上移下移操作后,选中被操作的节点以优化视觉效果。
基本原理
1.TreeView由TreeViewItem构成,TreeViewItem封装了自定义的数据对象,这个TreeViewItem称为container。
2.要选中某个节点,必须通过这个节点的TreeViewItem.Focus()或者TreeViewItem.isSelected=true这两个方法之一来设置选中状态。
3.那么要通过已知的自定义对象的某个数据(比如Id或者DisplayName的)来设置对应节点选中,就必须获得封装这个自定义对象的TreeViewItem。
4.获得封装自定义对象的TreeViewItem,可以通过father_treeviewItem.ItemContainerGenerator.ContainerFromItem(node)来获得。
5.father_treeviewItem必须是要选中的自定义对象对应的节点 的 上一个父节点 的 TreeViewItem。
public void SelectNodeById(int i)//根据ID选中节点{//tv是TreeView对象实例化后的名称//depttreenode是自定义数据对象,对应一个节点的数据//i为自定义数据对象的id属性TreeViewItem tvi = tv.ItemContainerGenerator.ContainerFromItem(tv.Items[0]) as TreeViewItem;GoDeepFindNode(i, tvi);}public void GoDeepFindNode(int i,TreeViewItem t)//i为节点中自定义对象的属性ID{foreach (depttreenode node in t.Items){TreeViewItem tvi = t.ItemContainerGenerator.ContainerFromItem(node) as TreeViewItem;if (node.id == i){tvi.Focus();break;}else{GoDeepFindNode(i, tvi);}}}
需要注意的是:
1.上述代码需要在TreeView的loaded事件完成之后使用,loaded事件在vs中的提示是:“当对元素进行布局、呈现,且可将其用于交互时发生”。
2。如果在Loaded事件完成之前调用代码,containerFromItem会返回null。
3.如果想使用代码,有两种情况,要么在onload事件中调用,要么就在确定loaded事件已完成的情况下调用,比如已经能看到TreeView了,再调用。