C#,WPF,treeview,我用了selected函数,为何每次点击子节点时,它会同时响应子节点和父节点的操作呢

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了C#,WPF,treeview,我用了selected函数,为何每次点击子节点时,它会同时响应子节点和父节点的操作呢相关的知识,希望对你有一定的参考价值。

参考技术A 因为点击事件是一个冒泡事件,会沿着视觉树上的控件一直向上传递。你只要在点击事件的最后加上e.handle = true;即可本回答被提问者采纳

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的特点。

以上是关于C#,WPF,treeview,我用了selected函数,为何每次点击子节点时,它会同时响应子节点和父节点的操作呢的主要内容,如果未能解决你的问题,请参考以下文章

c#WINFORM中treeview怎么进行数据绑定

如何以编程方式选择WPF TreeView中的项目?

简单的通用TreeView(WPF)

C# WPF Treeview - SelectedItemChanged 后处理?

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

treeview的问题