WPF中的TreeView,如何改变子节点的顺序, 给个例子,多谢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了WPF中的TreeView,如何改变子节点的顺序, 给个例子,多谢相关的知识,希望对你有一定的参考价值。

比如,A下面依顺序有B,C,D,E节点,希望将D移到B的下面,即显示顺序为B,D,C,E
节点都还是A的子节点,没有变,只是在treeview中显示的顺序变化
wpf里面貌似没有index,所有子节点的index都是-1
求例子~

非绑定的 情形像 winform, 不提.
下面说下 绑定时 的, 即
TreeView<---binding---> Collection (enumerable)
TreeView -binding-- Collection
Item 0 -------- [0]=B
item 1 -------- [1]=C
item 2 ------- [2]=D
item 3 ------- [3]=E
... .... ...
对於 Collection , 如果实现了 INotifyCollectionChanged interface, 你只需要改变 Collection 中 元素的顺序, TreeView 会 自动处理 呈现顺序 (即对数据源 data source 改变顺序)

如果 Collection 未实现 INotifyCollectionChanged, 则在改变 Collection 的元素的顺序後, 向 TreeView 发个通知, 要求更新 UI 即可.追问

已经实现了INotifyPropertyChanged接口
问题是,修改了里面的属性,treeview上的内容无变化(内存里已经发生变化)
如果重新加载datasource,内容的确是变化了,却会导致tree刷新,回到初始状态
如果用 treeview.items.refresh(),也会刷新整个视图,导致选择的节点复位,回到初始状态
如果解决这个问题,使之视图刷新后,选中节点焦点不丢失?

追答

INotifyPropertyChanged <---- Property
INotifyCollectionChanged <---- Collection

对于 CollectionChanged, 你 无需重新加载 datasource, 只需要 修改元素的顺序,
如 treeview 绑定了一个 col 的集合, 该集合已经实现 INotifyCollectionChanged, 则下面的代码会使 treeview 自动更新 ui:
tmp=o[2];
o[2]=o[3];
o[3]=tmp;

对于 选择的 (Selected) 节点:
1. 如果交换的(swapped) 的两项其中的一项 刚好是 当前选择的项 的话, 会导致 selectedIndex 变化至 -1, 因此, 在交换前可以将 treeview 的 selectedIndex 记录低, 交换后设置此属性.
2. 如果选择的项都不是 所交换的两项, 则不需要任何动作, treeview 不会改变 SelectedIndex.

追问

目前我只能在textbox中显示treeview选中项的值,
却不能用该textbox中来即时修改treeview显示的值....
而且, 修改之后treeview的DataContext和ItemsSource内容不同

希望
treeview的当前选中项的值,与外面的textbox双向绑定
treeview中的节点互换
能帮忙给个简单例子么?

追答



互換的的已經說過了.
這個一個 twoway binding 的 sample, 厘清其中的關係就 OK., 其它的情形是相似的.
Good Luck.

参考技术A 采用mvvm设计模式:两个treeview的Itemssource应该绑定各自的如ObservableCollcetion<DataClass>这样的集合。可以在DataClass中新增一个用于表示是否变灰的bool属性。在样式中使用触发器,当bool值为true,就变灰。然后当有个Treeview里面的Item添加到目的地列表中的时候,将该Item种的DataClass的是否变灰属性设置为true即可实现你要的功能。
记得DataClass实现接口INotifyPropertyChanged

其他人的回答你完全可以忽略了。因为其他人的回答把wpf程序硬是做成了winform。如果你用别人的方法,你的程序和winform做的,asp.net做的没啥区别了。也没有利用到wpf的特点。

wpf中的treeview如何增加2级节点?在C#中如何添加?

用treeview.Items.Add(XXX)可以添加一级节点,但二级节点怎么添加呢?

WPF中TreeView的items一般为TreeViewItem,同时TreeViewItem自身又可以包含新的TreeViewItem,从而形成一棵子树,你想要几级节点就有几级节点了。

C#如下:

            TreeView treeView = new TreeView();

            //第一级,在treeView上添加

            TreeViewItem treeViewItem1 = new TreeViewItem();

            treeViewItem1.Header = "第一级";

            treeView.Items.Add(treeViewItem1);

            //第二级,在treeViewItem1上添加

            TreeViewItem treeViewItem2 = new TreeViewItem();

            treeViewItem2.Header = "第二级";

            treeViewItem1.Items.Add(treeViewItem2);


            //第三级,在treeViewItem2上添加

            TreeViewItem treeViewItem3 = new TreeViewItem();

            treeViewItem3.Header = "第三级";

            treeViewItem2.Items.Add(treeViewItem3);


结果图:

追问

再请问下,我如何能给TreeViewItem的name属性赋值呢,一赋值就报错

参考技术A TreeViewItem的IsExpanded属性啊。
任务:树节点的展开,包括全展开,点击节点的展开,某一层节点的展开。
出发:
1.建树:<Grid>
<TreeView Height="200" HorizontalAlignment="Left" Margin="12,12,0,0" Name="treeView1" VerticalAlignment="Top" Width="120" />
</Grid>

2.为树写节点类(注意继承类):
public class PropertyNodeItem : TreeViewItem

public int Level get; set;
public PropertyNodeItem(string name, string DisplayName, int level)

this.Level = level;
this.Header = DisplayName;
this.Name = name;
// 在此点下面插入创建对象所需的代码。



3.为树增加节点:
public void BindTreeView()

PropertyNodeItem node1 = new PropertyNodeItem("1","中国",0);
PropertyNodeItem node2 = new PropertyNodeItem("2","北京市",1);
PropertyNodeItem node3 = new PropertyNodeItem("3","吉林省",1);
PropertyNodeItem node4 = new PropertyNodeItem("4","上海市",1);
node1.Items.Add(node2);
node1.Items.Add(node3);
node1.Items.Add(node4);
PropertyNodeItem node5 = new PropertyNodeItem("5","海淀区",2);
PropertyNodeItem node6 = new PropertyNodeItem("6","朝阳区",2);
PropertyNodeItem node7 = new PropertyNodeItem("7","大兴区",2);
node2.Items.Add(node5);
node2.Items.Add(node6);
node2.Items.Add(node7);
PropertyNodeItem node8 = new PropertyNodeItem("8","白山市",2);
PropertyNodeItem node9 = new PropertyNodeItem("9","长春市",2);
node3.Items.Add(node8);
node3.Items.Add(node9);
PropertyNodeItem node10 = new PropertyNodeItem("10","抚松县",3);
PropertyNodeItem node11 = new PropertyNodeItem("11","靖宇县",3);
node8.Items.Add(node10);
node8.Items.Add(node11);
treeView1.Items.Clear();
treeView1.Items.Add(node1);


按F5,发现树是出来了,但是未展开,这样的树肯定是影响效果的,那么怎么展开呢,树本身并没有提供展开方法,此时,就该IsExpanded出场了。比如你想要树节点的Level=0的节点展开,只要设node1.IsExpanded = true;那么再F5,就可见效果。举一反三,想让所有的展开,则设置每个父节点的IsExpanded = true即可,又方便,又好理解追问

我只是想知道怎么建子节点而已...不要复制粘贴嘛,你这篇我看过了

追答

关键是您要取一反三,不能什都让给您写好,这样您学程序是学不好的

追问

你发的我以前看过了,且会,你这样复制粘贴,是回答不好别人的问题的

追答

呵呵呵,。。。。。。。。。

以上是关于WPF中的TreeView,如何改变子节点的顺序, 给个例子,多谢的主要内容,如果未能解决你的问题,请参考以下文章

求:WPF中TreeView如何实现展开一个节点其他节点关闭!

wpf 自定义treeview 如何获得树节点集合

C#中,如何实现点击treeview父节点的文字达到展开改节点的效果?

c# treeview 字体大小

如何使WPF的TreeView节点之间有连线

如何将 Xml 属性绑定到 Treeview 节点,同时将 XDocument 数据绑定到 WPF Treeview