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中就可以实现逻辑。

posted on 2014-11-12 17:27 NET未来之路 阅读(...) 评论(...) 编辑 收藏

转载于:https://www.cnblogs.com/lonelyxmas/p/4092829.html

2000条你应知的WPF小姿势 基础篇57-62 依赖属性进阶相关推荐

  1. 2000条你应知的WPF小姿势 基础篇45-50 Visual TreeLogic Tree 附带两个小工具

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2, ...

  2. 2000条你应知的WPF小姿势 基础篇69-73 WPF Freeze机制和Template

    在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师.最为出色的是他维护了两个博客:2,000Things You Should Know About C#  和 2, ...

  3. 声学工程师应知道的150个声学基础知识

    和大家分享一下声学工程师应知道的150个声学基础知识. 注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面.但是关于声音的一些基础内容还是相同的,可以多多了解!!! 以 ...

  4. 声学工程师应知道的150个声学基础知识(全篇)

    和大家分享一下声学工程师应知道的150个声学基础知识. 注意,声学工程师和音频工程师可不是同一岗位,前者会更侧重于硬件,后者侧重于软件层面.但是关于声音的一些基础内容还是相同的,可以多多了解!!! 以 ...

  5. 《微信小程序-基础篇》初识微信小程序

    大家好,好久不见了,前段时间各种原因分享不稳定,后面一段时间内参与了主站的原力计划,请麻烦各位支持一下,万分感谢- 本系列将从零开始介绍微信小程序的开发,介绍完基础以后会实际同步开发一个微信小程序的项 ...

  6. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

  7. WPF ----在UserControl的xaml里绑定依赖属性

    场景:在定义wpf 用户控件的时候,希望使用时设置自定义的属性来改变用户控件里的状态或内容等. 下面直接上实例代码: 用户控件的后台代码,定义依赖属性 public partial class MyU ...

  8. html 自定义属性_五道自测题-你我都应知道的HTML小知识

    这几天学习了HTML相关的基础知识之后,老师出了五道自测题,通过这几天学习的总结,和查阅相关文档,我也作出了自己的理解,以下是我学习的相关心得分享给大家. 1.HTML元素.标签和属性之间的关联与区别 ...

  9. 小程序基础篇-视图与逻辑

    本次学习目标: 实现页面间的导航跳转 实现下拉刷新 实现上拉加载更多 知道小程序常用的生命周期函数 1.页面导航 页面导航指的是页面之前相互的跳转 浏览器之间的页面导航有两种:<a>;lo ...

  10. 微信小程序基础篇-模板与配置

    本篇学习目标 使用WXML渲染模板语法渲染页面结构 使用WXSS样式美化结构 使用app.json对项目进行全局配置 使用page.json对页面进行个性化配置 如何发起网络请求 1.WXML模板语法 ...

最新文章

  1. 前后端交互,网络请求
  2. 活动目录(Active Directory)安装
  3. windows10中git 远程仓库使用
  4. 很抱歉,这场大会我们没法卖票给你了
  5. python亲和性分析法推荐电影论文_数据挖掘-MovieLens数据集_电影推荐_亲和性分析_Aprioro算法...
  6. cuda linux编译器_CUDA与Linux系统
  7. Spring容器初始化和bean创建过程
  8. weak_ptr指针编程实验
  9. android cmd
  10. 架构师小跟班:如何高效又安全的清理Linux服务器上的缓存?
  11. 强烈推荐 MicroSoft Office OneNote
  12. Spring Data Redis实战之提供RedisTemplate
  13. 广义线性模型——逻辑回归(logistic regression)
  14. git rm -r --cached_【Git】工作中99%能用到的git命令
  15. 粤嵌gec6818项目设计_西安市幸福林带景观及亮化设计国际竞赛终期评审会顺利举行...
  16. WinForm中TextBox的几个基本技巧
  17. 原生js 获取屏幕各种宽高的方法
  18. 戴尔笔记本win10系统迁移到新固态硬盘
  19. FLStudio水果最新版本V21支持中文语言
  20. 计算机相关检测手段,计算机硬件测试的三种方法

热门文章

  1. php 远程函数,php 远程图片保存到本地的函数类
  2. springboot导出excel_在SpringBoot中如何在一分钟内实现快速导出Excel
  3. 苹果亮度自动调节怎么关闭_iPhone 总是自动亮屏,该怎么关闭?
  4. ios12后,获取不到WIFI(SSID)相关信息
  5. 漫谈依赖管理工具:从Maven,Gradle到Go
  6. Jmter接口测试二
  7. java项目中使用kettle的JNDI连接配置
  8. oracle归档文件管理
  9. Salt: 2015.8.8.2 L@匹配BUG
  10. winform制作简单计算器