【wpf】 当用了数据模板之后如何获取控件的Item?
创始人
2024-03-10 19:36:16
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

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

相关内容

热门资讯

保存时出现了1个错误,导致这篇... 当保存文章时出现错误时,可以通过以下步骤解决问题:查看错误信息:查看错误提示信息可以帮助我们了解具体...
汇川伺服电机位置控制模式参数配... 1. 基本控制参数设置 1)设置位置控制模式   2)绝对值位置线性模...
不能访问光猫的的管理页面 光猫是现代家庭宽带网络的重要组成部分,它可以提供高速稳定的网络连接。但是,有时候我们会遇到不能访问光...
表格中数据未显示 当表格中的数据未显示时,可能是由于以下几个原因导致的:HTML代码问题:检查表格的HTML代码是否正...
本地主机上的图像未显示 问题描述:在本地主机上显示图像时,图像未能正常显示。解决方法:以下是一些可能的解决方法,具体取决于问...
表格列调整大小出现问题 问题描述:表格列调整大小出现问题,无法正常调整列宽。解决方法:检查表格的布局方式是否正确。确保表格使...
不一致的条件格式 要解决不一致的条件格式问题,可以按照以下步骤进行:确定条件格式的规则:首先,需要明确条件格式的规则是...
Android|无法访问或保存... 这个问题可能是由于权限设置不正确导致的。您需要在应用程序清单文件中添加以下代码来请求适当的权限:此外...
【NI Multisim 14...   目录 序言 一、工具栏 🍊1.“标准”工具栏 🍊 2.视图工具...
银河麒麟V10SP1高级服务器... 银河麒麟高级服务器操作系统简介: 银河麒麟高级服务器操作系统V10是针对企业级关键业务...