2000条你应知的WPF小姿势 基础篇57-62 依赖属性进阶
原文:2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2,000 Things You Should Know About WPF 。他以类似微博式的150字简短语言来每天更新一条WPF和C#重要又容易被遗忘的知识。Follow他的博客也有一段日子了,很希望能够分享给大家。
本系列我不仅会翻译他的每一个tip,也会加入自己开发之中的看法和见解。本系列我希望自己也能和他一样坚持下来,每天的进步才能促成伟大。
在这里郑重说明.该系列是基于Sean Sexton先生的英文博客, Sean Sexton拥有全部版权和撤销权利。
前文:<1-7> , <8-14>,<15-21>22-27>, <28-33>,<34-39>,<40-44>,<45-50>
[小九的学堂,致力于以平凡的语言描述不平凡的技术。如要转载,请注明来源:小九的学堂。cnblogs.com/xfuture]
#57 依赖属性值变化时的通知事件
当一个依赖属性值改变的时候,实现它的类可以随时得知其改变。当该类注册该依赖属性的时候可以指定PropertyChangedCallback来获取其事件。
PropertyMetadata ageMetadata =new PropertyMetadata(18, // Default valuenew PropertyChangedCallback(OnAgeChanged), // ** call when property changesnew CoerceValueCallback(OnAgeCoerceValue));// Register the property AgeProperty =DependencyProperty.Register("Age", // Property's nametypeof(int), // Property's typetypeof(Person), // Defining class' typeageMetadata, // Defines default value & callbacks (optional)new ValidateValueCallback(OnAgeValidateValue)); // validation (optional)
该类可以通过回调的函数才处理当值改变时候的逻辑。比如通过一个值的改变影响另一个值。
private static void OnAgeChanged(DependencyObject depObj, DependencyPropertyChangedEventArgs e) {Person p = (Person)depObj;p.AARPCandidate = (int)e.NewValue > 60 ? true : false; }
#58 验证依赖属性
注册依赖属性时,可以进行验证回调。当依赖属性被指定一个新值得时候,可以先通过验证函数验证,返回true or false来表示其是否有效。当注册这个依赖属性的时候可以指定其验证回调函数。
AgeProperty =DependencyProperty.Register("Age", // Property's nametypeof(int), // Property's typetypeof(Person), // Defining class' typeageMetadata, // Defines default value & changed/coercion callbacks (optional)new ValidateValueCallback(OnAgeValidateValue)); // *** validation (optional)
验证回调函数可以对新值进行验证
private static bool OnAgeValidateValue (object value) {int age = (int) value;// Only allow reasonable agesreturn (age > 0) && (age < 120); }
如果值不能被接受,则抛出exception
Person p = new Person("Samuel", "Clemens"); p.Age = 40; // ok p.Age = 300; // throws System.ArgumentException
#59 强制改变依赖属性值
人在做事的时候,都需要考虑一个底线,很多时候做了过分的事情你就期望有人提醒你,“嗨,这个事情你越线了!”。依赖属性就有一个特性,可以在你越线的时候把你拉回底线。那就是CoerceValueCallback。当你apple新的value的时候,它是最后一层安全系数。
你可以在定义这个依赖属性的时候,定义CoerceValueCallback.
PropertyMetadata ageMetadata =new PropertyMetadata(18, // Default valuenew PropertyChangedCallback(OnAgeChanged),new CoerceValueCallback(OnAgeCoerceValue)); // ** allow class to coerce value// Register the property AgeProperty =DependencyProperty.Register("Age", // Property's nametypeof(int), // Property's typetypeof(Person), // Defining class' typeageMetadata, // Defines default value & changed/coercion callbacks (optional)new ValidateValueCallback(OnAgeValidateValue)); // validation (optional)
你可以在delegate的OnAgeCoerceValue方法里来控制它的界限,并给予其新值。
private static object OnAgeCoerceValue(DependencyObject depObj, object baseValue) {int coercedValue = (int)baseValue;if ((int)baseValue > 120)coercedValue = 120;if ((int)baseValue < 1)coercedValue = 1;return coercedValue; }
#60 Wpf中基于依赖属性特性实现的一个例子
依赖属性有三种回调函数类可以来进行控制:
1. PropertyChangedCallback 当获取一个新值得时候触发
2. ValidateValueCallback 决定值是否有效
3. CoerceValueCallback 强制更改为其他值
DataGrid.FrozenColumnCount是一个三种逻辑都实现了的例子。
1. PropertyChangedCallback. 渲染标题的时候,使之能正确显示。
2. ValidateValueCallback 验证是否为负值。
3. CoerceValueCallback 如果赋予的值大于其行数,则强制为最大值。
#61 响应变化
在WPF编程中对依赖属性除了使用PropertyChangedCallback事件来进行响应变化,还有其他方式。
有两种方式可以做到:
1. Data Binding
2. Triggers
#62 Triggers
下面介绍Triggers。可以通过触发器Triggers来响应值变化时引起的蝴蝶效应。
由于触发器只能针对离散值。所以下面的例子是简单的布尔值关联的触发器Trigger
<CheckBox Content="Check Me" HorizontalAlignment="Center"><CheckBox.Style><Style TargetType="CheckBox"><Style.Triggers><Trigger Property="IsChecked" Value="true"><Setter Property="Foreground" Value="BlueViolet"/></Trigger></Style.Triggers></Style></CheckBox.Style> </CheckBox>
但该checkbox选中的时候,字体会被触发更改为BlueViolet.这边是trigger实现值变化时蝴蝶效应的方法。
而且Triggers是不需要在后台代码中写任何code的。只需要在xaml中就可以实现逻辑。
转载于:https://www.cnblogs.com/lonelyxmas/p/4092829.html
2000条你应知的WPF小姿势 基础篇57-62 依赖属性进阶相关推荐
- 2000条你应知的WPF小姿势 基础篇45-50 Visual TreeLogic Tree 附带两个小工具
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2, ...
- 2000条你应知的WPF小姿势 基础篇69-73 WPF Freeze机制和Template
在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C# 和 2, ...
- 声学工程师应知道的150个声学基础知识
和大家分享一下声学工程师应知道的150个声学基础知识. 注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面.但是关于声音的一些基础内容还是相同的,可以多多了解!!! 以 ...
- 声学工程师应知道的150个声学基础知识(全篇)
和大家分享一下声学工程师应知道的150个声学基础知识. 注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面.但是关于声音的一些基础内容还是相同的,可以多多了解!!! 以 ...
- 《微信小程序-基础篇》初识微信小程序
大家好,好久不见了,前段时间各种原因分享不稳定,后面一段时间内参与了主站的原力计划,请麻烦各位支持一下,万分感谢- 本系列将从零开始介绍微信小程序的开发,介绍完基础以后会实际同步开发一个微信小程序的项 ...
- WPF快速入门系列(2)——深入解析依赖属性
一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...
- WPF ----在UserControl的xaml里绑定依赖属性
场景:在定义wpf 用户控件的时候,希望使用时设置自定义的属性来改变用户控件里的状态或内容等. 下面直接上实例代码: 用户控件的后台代码,定义依赖属性 public partial class MyU ...
- html 自定义属性_五道自测题-你我都应知道的HTML小知识
这几天学习了HTML相关的基础知识之后,老师出了五道自测题,通过这几天学习的总结,和查阅相关文档,我也作出了自己的理解,以下是我学习的相关心得分享给大家. 1.HTML元素.标签和属性之间的关联与区别 ...
- 小程序基础篇-视图与逻辑
本次学习目标: 实现页面间的导航跳转 实现下拉刷新 实现上拉加载更多 知道小程序常用的生命周期函数 1.页面导航 页面导航指的是页面之前相互的跳转 浏览器之间的页面导航有两种:<a>;lo ...
- 微信小程序基础篇-模板与配置
本篇学习目标 使用WXML渲染模板语法渲染页面结构 使用WXSS样式美化结构 使用app.json对项目进行全局配置 使用page.json对页面进行个性化配置 如何发起网络请求 1.WXML模板语法 ...
最新文章
- 前后端交互,网络请求
- 活动目录(Active Directory)安装
- windows10中git 远程仓库使用
- 很抱歉,这场大会我们没法卖票给你了
- python亲和性分析法推荐电影论文_数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法...
- cuda linux编译器_CUDA与Linux系统
- Spring容器初始化和bean创建过程
- weak_ptr指针编程实验
- android cmd
- 架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?
- 强烈推荐 MicroSoft Office OneNote
- Spring Data Redis实战之提供RedisTemplate
- 广义线性模型——逻辑回归(logistic regression)
- git rm -r --cached_【Git】工作中99%能用到的git命令
- 粤嵌gec6818项目设计_西安市幸福林带景观及亮化设计国际竞赛终期评审会顺利举行...
- WinForm中TextBox的几个基本技巧
- 原生js 获取屏幕各种宽高的方法
- 戴尔笔记本win10系统迁移到新固态硬盘
- FLStudio水果最新版本V21支持中文语言
- 计算机相关检测手段,计算机硬件测试的三种方法
热门文章
- php 远程函数,php 远程图片保存到本地的函数类
- springboot导出excel_在SpringBoot中如何在一分钟内实现快速导出Excel
- 苹果亮度自动调节怎么关闭_iPhone 总是自动亮屏,该怎么关闭?
- ios12后,获取不到WIFI(SSID)相关信息
- 漫谈依赖管理工具:从Maven,Gradle到Go
- Jmter接口测试二
- java项目中使用kettle的JNDI连接配置
- oracle归档文件管理
- Salt: 2015.8.8.2 L@匹配BUG
- winform制作简单计算器