【wpf】ItemsControl 的Binding 小技巧

news2024/9/30 5:33:17

 ItemsControl 非常常用和好用的控件,我经常将之用于配置界面!

比如这么一个配置界面:

 整体是一个ItemsControl,每个子界面就是其中的一个Item。

ItemsControl 的 ItemsSource 绑定到 ParameterInfo 的集合

public ObservableCollection<ParameterInfo> configInfos { get; set; } = new ObservableCollection<ParameterInfo>();

每个Item 绑定的内容都对应集合元素的项 ParameterInfo

public class ParameterInfo : BindableBase
    {
        public const string file_name = "调试参数";
        #region 模板匹配相关参数
        public MatchInfo matchInfo { get; set; } = new MatchInfo();
        private string mdPath;
        /// <summary>
        /// 模板路径
        /// </summary>
        public string MdPath
        {
            get { return mdPath; }
            set { SetProperty(ref mdPath, value); }
        }
        #endregion
        #region 瑕疵检测
        public DefectInfo defectInfo { get; set; } = new DefectInfo();
        #endregion
        private string proName = "未命名";
        /// <summary>
        /// 项目名称
        /// </summary>
        public string ProName
        {
            get { return proName; }
            set { SetProperty(ref proName, value); }
        }
    }

这里有个问题,每个子界面都有一个“打开” 按键。而 打开按键的命令绑定不在ParameterInfo 中,而是在ViewModel中,如果直接填写 命令名称,就会绑定失败。

于是就有写法:

<Button MinWidth="50" DockPanel.Dock="Right" 
 Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.OpenMdCmd}"
CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}">打开</Button>

首先我们看到:

Command="{Binding RelativeSource={RelativeSource Mode=FindAncestor, AncestorType={x:Type UserControl}}, Path=DataContext.OpenMdCmd}"

就是解决在ItemsControl,无法找到数据源的问题,使用了 RelativeSource,通过 FindAncestor的方式,找到了 UserControl 的 DataContext 中的 命令属性定义。

我在之前的文章中也介绍到了:

【wpf】深度解析,Bingding是如何寻找数据源的_wpf findan_code bean的博客-CSDN博客目前我常用存放数据源的一般控件都有Resources和DataContext属性,列表控件会多一个ItemsSource。可以放多个资源,但是需要给每一个资源指定一个key。而和只能放一个对象(不需要指定key)https://blog.csdn.net/songhuangong123/article/details/126195727?ops_request_misc=%257B%2522request%255Fid%2522%253A%2522167765404916800213065489%2522%252C%2522scm%2522%253A%252220140713.130102334.pc%255Fblog.%2522%257D&request_id=167765404916800213065489&biz_id=0&utm_medium=distribute.pc_search_result.none-task-blog-2~blog~first_rank_ecpm_v1~rank_v31_ecpm-1-126195727-null-null.article_score_rank_blog&utm_term=TemplatedParent&spm=1018.2226.3001.4450#:~:text=%E3%80%90wpf%E3%80%91%E6%B7%B1%E5%BA%A6%E8%A7%A3%E6%9E%90%EF%BC%8CBingding%E6%98%AF%E5%A6%82%E4%BD%95%E5%AF%BB%E6%89%BE%E6%95%B0%E6%8D%AE%E6%BA%90%E7%9A%84可以具体看看

此时,OpenMdCmd确实已经绑定成功,但是有个问题,每个子界面的 “打开按钮” 都会调用这个命令,OpenMdCmd对应的方法,如何得知具体是哪个子界面的调用的呢

这里,就进入今天的主题内容,

CommandParameter="{Binding RelativeSource={RelativeSource Mode=TemplatedParent}}"

我们这里的 CommandParameter,就是给CMD传递参数,而且也使用了 RelativeSource 的方式。

这里的 Mode 使用的 TemplatedParent。这种方式,之前的那篇文章也提到过,不过当时只知道会用于 “控件模板”, 想不到在这里,用到“数据模板” 也有它的作用。

于是  OpenMdCmd 里 就接收一下这个参数,看看是个啥?

名称类型
item{"子母勾"}object {System.Windows.Controls.ContentPresenter}
◢ Content"子母勾"object {VisualMatching.Models.ParameterInfo}
proName"子母勾"string
MdPathnullstring
ProName"子母勾"string
▶ PropertyChanged{Method = System.ComponentModel.PropertyChangedEventHandler
▶ defectInfoVisualMatching.Models.DefectInfo
▶ matchInfoVisualMatching.Models.MatchInfo
mdPathnullstring
▶ 静态成员

就是 System.Windows.Controls.ContentPresenter,这个就是数据模板对应的玩意儿。

关于 ContentPresenter 我的另一篇文章有详细讲解:

【wpf】子项容器模板 控件模板 数据模板 逻辑树 视觉树 之间的关系_wpf模板 树_code bean的博客-CSDN博客wpf中的那些模板之深度解析https://blog.csdn.net/songhuangong123/article/details/126071796#:~:text=%E3%80%90wpf%E3%80%91%E5%AD%90%E9%A1%B9%E5%AE%B9%E5%99%A8%E6%A8%A1%E6%9D%BF%20%E6%8E%A7%E4%BB%B6%E6%A8%A1%E6%9D%BF%20%E6%95%B0%E6%8D%AE%E6%A8%A1%E6%9D%BF%20%E9%80%BB%E8%BE%91%E6%A0%91%20%E8%A7%86%E8%A7%89%E6%A0%91%20%E4%B9%8B%E9%97%B4%E7%9A%84%E5%85%B3%E7%B3%BB

继续往里面看,它其中的一个属性,Content,就是我们自定义的子项类 ParameterInfo

也就是说Content就是你当前选择的子项Item对应的数据。那么在进入主题时,提出问题也就迎刃而解了!

最近,再通过 Path 属性 过滤一下,就能直接拿到  ParameterInfo 对象:

CommandParameter="{Binding  Path=Content, RelativeSource={RelativeSource Mode=TemplatedParent}}"

 

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.coloradmin.cn/o/381077.html

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈,一经查实,立即删除!

相关文章

最简单的微信多开防撤回方式

微信&#xff0c;大家工作中生活中用的最多的一款应用&#xff1b;很多公司喜欢用微信来作为工作沟通的工具&#xff0c;官方原版只支持登陆一个微信&#xff0c;这对于需要在电脑上登陆多个微信账号的朋友来说肯定是极其的不方便。另外有的时候别人撤回了一些重要消息&#xf…

目前医疗器械数据库有哪些?最推荐哪些?

在英特网发达的今天&#xff0c;医疗器械信息查询应该是一件便捷的事情&#xff0c;但不知道大家有没有遇到过这种类似情况&#xff0c;就是在查询医疗器械信息时&#xff0c;如果通过百度去检索&#xff0c;查到的结果往往会不尽人意&#xff0c;比如信息陈旧、太分散、来源不…

Spring security 个人理解

改文章写的很好&#xff1a;https://zhuanlan.zhihu.com/p/342755411 Spring security 分为两个部分 登陆认证权限认证 登陆认证 其实就是就是登陆注册&#xff0c;然后获取登陆凭证的问题 操作如下 登陆账号密码&#xff0c;通过账号查询出用户数据&#xff0c;然后密码进…

如何使用DeadFinder寻找失效链接

关于DeadFinder DeadFinder是一款功能强大的链接分析工具&#xff0c;该工具可以帮助广大研究人员快速地寻找目标页面中的无效链接&#xff08;死链&#xff09;。所谓死链&#xff0c;即一个页面中存在的无法被连接的一条链接。这些链接如果一直保留在页面中的话&#xff0c;…

Hive中的高阶函数(二)

1、UDTF之explode函数 explode(array)将array列表里的每个元素生成一行&#xff1b; explode(map)将map里的每一对元素作为一行&#xff0c;其中key为一列&#xff0c;value为一列&#xff1b; 一般情况下&#xff0c;explode函数可以直接使用即可&#xff0c;也可以根据需要结…

[python入门(53)] - python中的OS模块(包) - 2

目录 ❤ OS模块和path模块(函数) ❤ os模块中操作目录以及文件的函数 ❤ os模块中遍历目录数 ❤ 一些表现形式参数 ❤ 获取在进程的控制终端上登录的用户的名称&#xff1a; os.getlogin() &#xff08;即此时pc登录的用户名&#xff09; ❤ 总结 ❤ os.listdir()…

3月4日线下讲座《项目经理五项管理锦囊》

在项目管理过程中&#xff0c;你是否有过因为人际关系紧张&#xff0c;而导致团队协作不顺畅&#xff1f; 项目团队内耗严重&#xff0c;成员之间缺乏信任冲突较多&#xff0c;影响士气项目质量及项目周期等问题&#xff1f; 为什么会导致这样的结果&#xff1f;如何避免踩坑&a…

TAS5411QPWPRQ1引脚图LP873220RHDRQ1汽车应用开关稳压器

8W单声道汽车类D类音频放大器&#xff1a;TAS5411QPWPRQ1引脚图 【概述】TAS5411-Q1是一款单声道D类音频放大器&#xff0c;非常适用于汽车类紧急呼叫(eCall)、远程信息处理、仪表板应用。该器件采用14.4VDC汽车电池供电&#xff0c;可在负载为4Ω且THDN不超过10%的情况下提供高…

MQTT的学习之Mosquitto集群搭建

文章钢要&#xff1a; 1、进行双服务器搭建 2、进行多服务器搭建 一、Mosquitto的分布式集群部署 如果需要做并发量很大的时候就需要考虑做集群处理&#xff0c;但是我在查找资料的时候发现并不多&#xff0c;所以整理了一下&#xff0c;搭建简单的Mosquitto集群模式。 首…

Win11搜索栏无法使用怎么办?

随着Windows 11的正式发布&#xff0c;许多用户已经升级了他们的操作系统。但是安装Win11系统之后&#xff0c;人们发现它有一些问题。例如&#xff0c;Win11搜索栏无法使用&#xff0c;这极大地影响了用户体验。那我们该如何解决Windows搜索栏用不了这一问题&#xff1f;方法1…

Matplotlib精品学习笔记002-Pyplot详解,快速绘图

Matplotlib精品学习笔记002-Pyplot详解&#xff0c; matplotlib.pyplot集合了一系列功能&#xff0c;运行起来和MATLAB相似。 每个pyplot功能都会对画布&#xff08;figure&#xff09;进行修改&#xff1a;包括创建画布&#xff0c;在画布上创建一个画图区&#xff0c;向画图…

【JVM】垃圾回收器

垃圾回收器 Serial收集器 单线程&#xff0c;进行垃圾收集工作时必须暂停其他所有的工作线程。STW造成了不好的用户体验。 新生代采用复制算法&#xff0c;老年代采用标记整理算法。 Serial Old Serial 收集器的老年代版本&#xff0c;它同样是一个单线程收集器。它主要有两…

FairGuard-Windows加固工具版本更新日志

FairGuard-Windows加固工具1.2.2版本更新日志&#xff1a; ■ 增加Unity Resources资源加密的支持; ■ 增加单独Assetbundle资源加密&#xff0c;并同时支持压缩包和文件夹作为输入的方式; ■ 增加对游戏原文件夹加固的支持; Windows加固方案介绍 FairGuard专为游戏量身定…

IntelliJ IDEA 安装JRebel实现热部署详细版(亲测有效)

简介 JRebel可快速实现热部署&#xff0c;节省了大量重启时间&#xff0c;提高了个人开发效率。 JRebel是一款JVM插件&#xff0c;它使得Java代码修改后不用重启系统&#xff0c;立即生效。 安装JRebel 1.file–>setting–>plugins–>在Marketplace的搜索框输入JRe…

【记录问题】RuntimeError:working outside of application context. Flask使用SQLAlchemy数据库

前提&#xff1a;Flask使用SQLAlchemy数据库 本质&#xff1a;依赖包版本不匹配 问题1&#xff1a;报错RuntimeError&#xff1a;working outside of application context. 运行程序报错&#xff0c;如下错误&#xff1a; 原因&#xff1a;flask-sqlalchemy 版本过高导致&am…

试题 算法训练 自行车停放

问题描述 有n辆自行车依次来到停车棚&#xff0c;除了第一辆自行车外&#xff0c;每辆自行车都会恰好停放在已经在停车棚里的某辆自行车的左边或右边。(e.g.停车棚里已经有3辆自行车&#xff0c;从左到右编号为&#xff1a;3,5,1。现在编号为2的第4辆自行车要停在5号自行车的左…

python自学之《21天学通Python》(16)——第19章 用Pillow库处理图片

Pillow是Python2.X时代比较流行的Python ImagingLibrary&#xff08;简称Pillow&#xff09;图像处理库的分支&#xff0c;并修复了一些bug。Pillow提供了对Python3的支持&#xff0c;为Python3解释器提供了图像处理的功能。和Pillow库一样提供了广泛的文件格式支持、高效的内部…

IDEA如何创建一个springboot项目

要想进入springboot的殿堂&#xff0c;你的跨进springboot的门槛&#xff0c;下面就是使用IDEA初始话一个简单的springboot项目。 选择Create New Project 选择Spring Initializer——>选择对应的jdk版本——>Default默认在线构建&#xff0c;需要联网噢 选择自己想写…

2005-2019年我国地级市国内外旅游人数和收入数据

旅游产业的发展情况是一个城市经济和文化影响力的重要指标&#xff0c;我们在很多研究中都会用到旅游相关的数据&#xff0c;之前我们介绍过1978-2020年的中国旅游统计年鉴和2022年13604条的全国A级景区数据&#xff08;可以查看之前推送的文章&#xff09;。 本次我们为大家介…

上传文件-课后程序(JAVA基础案例教程-黑马程序员编著-第九章-课后作业)

【案例9-3】 客户端向服务端上传文件 【案例介绍】 1.案例描述 编写一个客户端向服务端上传文件的程序&#xff0c;要求使用TCP通信的的知识&#xff0c;将本地机器输入的路径下的文件上传到D盘中名称为upload的文件夹中。并把客户端的IP地址加上count标识作为上传后文件的文…