【wpf】 当用了数据模板之后如何获取控件的Item?
创始人
2024-03-09 16:32:15
0

背景

 我对一个treeview使用了数据模板

                  	

数据源的数据结构为:

public class ToolsNodeItem{public string Icon { get; set; }public string DisplayName { get; set; }//Tree的绑定源就要这样套娃!public ObservableCollection Children { get; set; }public ToolsNodeItem(){Children = new ObservableCollection();}}

完成后大概就是这个样子

 现在我的需求是,右键点击这些节点,弹出一个右键菜单然后对节点进行操作。比如删除这个节点。

弹出菜单不难:(加上这段就行)



现在问题来了,因为是右键菜单,你会发现右键单击后,菜单是弹出来了,但是此时节点并没有被选中,所以此时即使你为treeview设置了PreviewMouseLeftButtonDown这些事件,然后查看sender(treeview)发现,treeview的SelectItem依然是null,这样就无法确认到底是那个item别选中,就没办法对item操作。所以首先要想办法让右键能选中控件。

于是我需要将模板中的StackPanel添加鼠标右键事件:下面这种是MVVM的写法!

                 		

这里需要说明一下:以前,我都是这么写的:



这样写,命令接收的参数就是我们平时使用事件的e的内容,但是由于我们用到了数据模板,导致e中的内容是和你点击的地方不同而不同的:

 如果你点击的位置是TreeViewItem的图片位置,那么这里的OriginalSource以及Source就是Image,如果你点到的是文字位置对应的就是TextBlock。如果不使用数据模板的话,我们得到的其实就是TreeViewItem,然后使用TreeViewItem对象,调用Forks就好了。

用了数据版本就没法拿到TreeViewItem吗?

于是我咨询了一下老师:

 目前我认为,用了数据版本就基本没办法拿到TreeViewItem了。

于是就有了:

有了它,也拿不到TreeViewItem,但是得到了ToolsNodeItem,就是TreeViewItem对应的数据源的子项:(不管你点击TreeViewItem的哪个位置都一样)

ItemContainerStyle

回想到老师的这句话:

 我拿不到TreeViewItem但是我可以,绑定TreeViewItem的IsSelected属性啊!但是数据模板不是TreeViewItem啊?

这就要看 ItemContainerStyle 这个样式了,它规定了子项的样式,而该样式就可以设置属性IsSelected!

这个几个容易混淆的概念,大家可以对比一下:

于是,我又在ToolsNodeItem模型中增加了一个属性IsSelected

 

private bool isSelected =false;public bool IsSelected
{get { return isSelected; }set { SetProperty(ref isSelected, value); }
}

前台代码添加部分:

 BasedOn="{StaticResource {x:Type TreeViewItem}}"

这里的BasedOn是为了继续使用handcontrol的样式,覆盖默认的样式。

数据驱动界面

最后将ToolsNodeItem中的IsSelected设置为True,这样就能通过数据IsSelected,驱动界面TreeViewItem的IsSelected为True,从而选中。

所以使用了数据模板之后,就要将 数据驱动界面 进行到底。

番外

其实,用了模板后,有一种方法能拿到TreeViewItem

 不过也是,选中之后的事情了所以,不适合当前背景需求。

相关内容

热门资讯

倍轻松(688793)披露涉及... 截至2025年12月24日收盘,倍轻松(688793)报收于26.43元,较前一交易日上涨1.23%...
景区5万月薪招185腹肌帅哥陪... 月薪5w+,急招185+帅哥腹肌陪滑官!近日,四川绵阳九皇山景区一则招聘文章,吸引了网友注意。网友表...
海南这五年:构建与自贸港建设相... 中新网海口12月24日电 (记者 符宇群)海南省司法厅厅长王磊24日在海口举行的海南司法行政“十四五...
七彩化学(300758)披露提... 截至2025年12月24日收盘,七彩化学(300758)报收于13.16元,较前一交易日下跌0.3%...
广田集团(002482)披露修... 截至2025年12月24日收盘,广田集团(002482)报收于1.73元,较前一交易日上涨1.17%...
靖国神社,被起诉 张昀/央视新闻 当地时间23日,二战期间被强征兵役的韩军遗属等举行记者会,介绍诉讼内容。 当地时间...
蓝科高新(601798)披露制... 截至2025年12月24日收盘,蓝科高新(601798)报收于9.0元,较前一交易日下跌0.33%,...
[视频]被日强征韩籍军人遗属起... 央视网消息(新闻联播):二战时期被日军强制征兵的部分韩籍军人的遗属23日向韩国首尔中央地方法院提起诉...
镇江经开民警巧妙化解停车纠纷,... 扬子晚报网12月24日讯(通讯员 毛润民 雷楚楚 记者 姜天圣)12月20日晚,镇江经开区丁卯派出所...
“国际”清风 | “宪法引领·... 在医院党委的高度重视和支持下,为深入学习宣传宪法、弘扬宪法精神,切实提升全院员工的法治素养,我院于第...