在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件工程师。最为出色的是他维护了两个博客:2,000ThingsYou 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(
, // Default value
new PropertyChangedCallback(OnAgeChanged), // ** call when property changes
new CoerceValueCallback(OnAgeCoerceValue)); // Register the property
AgeProperty =
DependencyProperty.Register(
"Age", // Property's name
typeof(int), // Property's type
typeof(Person), // Defining class' type
ageMetadata, // 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 > ? true : false;
}

  #58 验证依赖属性

  注册依赖属性时,可以进行验证回调。当依赖属性被指定一个新值得时候,可以先通过验证函数验证,返回true or false来表示其是否有效。当注册这个依赖属性的时候可以指定其验证回调函数。

  

AgeProperty =
DependencyProperty.Register(
"Age", // Property's name
typeof(int), // Property's type
typeof(Person), // Defining class' type
ageMetadata, // 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 ages
return (age > ) && (age < );
}

  如果值不能被接受,则抛出exception

  

Person p = new Person("Samuel", "Clemens");
p.Age = ; // ok
p.Age = ; // throws System.ArgumentException

  

  #59 强制改变依赖属性值

  人在做事的时候,都需要考虑一个底线,很多时候做了过分的事情你就期望有人提醒你,“嗨,这个事情你越线了!”。依赖属性就有一个特性,可以在你越线的时候把你拉回底线。那就是CoerceValueCallback。当你apple新的value的时候,它是最后一层安全系数。

  你可以在定义这个依赖属性的时候,定义CoerceValueCallback.

  

PropertyMetadata ageMetadata =
new PropertyMetadata(
, // Default value
new PropertyChangedCallback(OnAgeChanged),
new CoerceValueCallback(OnAgeCoerceValue)); // ** allow class to coerce value // Register the property
AgeProperty =
DependencyProperty.Register(
"Age", // Property's name
typeof(int), // Property's type
typeof(Person), // Defining class' type
ageMetadata, // 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 > )
coercedValue = ; if ((int)baseValue < )
coercedValue = ; 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中就可以实现逻辑。

2000条你应知的WPF小姿势 基础篇<57-62 依赖属性进阶>的更多相关文章

  1. 2000条你应知的WPF小姿势 基础篇<15-21>

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

  2. 2000条你应知的WPF小姿势 基础篇<78-81 Dialog/Location/WPF设备无关性>

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

  3. 2000条你应知的WPF小姿势 基础篇<74-77 WPF 多窗口Tips>

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

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

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

  5. 2000条你应知的WPF小姿势 基础篇<63-68 Triggers和WPF类逻辑结构>

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

  6. 2000条你应知的WPF小姿势 基础篇<51-56 依赖属性>

    前一阵子由于个人生活原因,具体见上一篇,耽搁了一阵子,在这里也十分感谢大家支持和鼓励.现在开始继续做WPF2000系列. 在正文开始之前需要介绍一个人:Sean Sexton. 来自明尼苏达双城的软件 ...

  7. 2000条你应知的WPF小姿势 基础篇<45-50 Visual Tree&Logic Tree 附带两个小工具>

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

  8. 2000条你应知的WPF小姿势 基础篇<40-44 启动关闭,Xaml,逻辑树>

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

  9. 2000条你应知的WPF小姿势 基础篇<34-39 Unhandled Exceptions和Resource>

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

随机推荐

  1. 彻底理解AC多模式匹配算法

    (本文尤其适合遍览网上的讲解而仍百思不得姐的同学) 一.原理 AC自动机首先将模式组记录为Trie字典树的形式,以节点表示不同状态,边上标以字母表中的字符,表示状态的转移.根节点状态记为0状态,表示起 ...

  2. 重温Http协议--请求报文和响应报文

    http协议是位于应用层的协议,我们在日常浏览网页比如在导航网站请求百度首页的时候,会先通过http协议把请求做一个类似于编码的工作,发送给百度的服务器,然后在百度服务器响应请求时把相应的内容再通过h ...

  3. node.js学习(三)简单的node程序&&模块简单使用&&commonJS规范&&深入理解模块原理

    一.一个简单的node程序 1.新建一个txt文件 2.修改后缀 修改之后会弹出这个,点击"是" 3.运行test.js 源文件 使用node.js运行之后的. 如果该路径下没有该 ...

  4. java: web应用中不经意的内存泄露

    前面有一篇讲解如何在spring mvc web应用中一启动就执行某些逻辑,今天无意发现如果使用不当,很容易引起内存泄露,测试代码如下: 1.定义一个类App package com.cnblogs. ...

  5. WPF 微信 MVVM

    公司的同事离职了,接下来的日子可能会忙碌,能完善DEMO的时间也会少了,因此,把做的简易DEMO整体先记录一下,等后续不断的完善. 参考两位大神的日志:WEB版微信协议部分功能分析.[完全开源]微信客 ...

  6. dedecms 后台栏目添加图片

    前台调用栏目时需要显示图标,整理一下: 第一步:“系统->SQL命令工具” , 插入sql语句 alter table dede_arctype add typeimg varchar() 第二 ...

  7. TFS 生成发布代理

    下载Agent 后,执行配置命令     参考 安装TFS(2015)工作组模式代理服务器(Agent)

  8. 修改MySQL默认字符集编码

    好记心不如烂笔头,很多东西当时没记下来,过了就忘了,下次用到时又得浪费好多时间才能解决.今天又遇到修改MySQL默认字符集编码的问题,折腾了半天解决了,赶快记录下来,以后就不用每次折腾了. 查看MyS ...

  9. Fresnel Reflection - 菲涅尔反射

    [Fresnel Reflection - 菲涅尔反射] “菲涅尔”是一个人的名字,因为他发现了一个有关反射的光学现象,这个现象就用这个人的名字命名了.那么,是什么现象呢? 这就是反射/折射与视点角度 ...

  10. Hilbert-Huang Transform(希尔伯特-黄变换)

    在我们正式开始讲解Hilbert-Huang Transform之前,不妨先来了解一下这一伟大算法的两位发明人和这一算法的应用领域 Section I 人物简介 希尔伯特:公认的数学界“无冕之王”,1 ...