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

时间:2022-09-04 07:26:32

  在正文开始之前需要介绍一个人: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实现值变化时蝴蝶效应的方法。

  

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

  而且Triggers是不需要在后台代码中写任何code的。只需要在xaml中就可以实现逻辑。

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

  1. 2000条你应知的WPF小姿势 基础篇&lt&semi;63-68 Triggers和WPF类逻辑结构&gt&semi;

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

  2. 2000条你应知的WPF小姿势 基础篇&lt&semi;51-56 依赖属性&gt&semi;

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

  3. 2000条你应知的WPF小姿势 基础篇&lt&semi;40-44 启动关闭&comma;Xaml&comma;逻辑树&gt&semi;

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

  4. 2000条你应知的WPF小姿势 基础篇&lt&semi;15-21&gt&semi;

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

  5. 2000条你应知的WPF小姿势 基础篇&lt&semi;78-81 Dialog&sol;Location&sol;WPF设备无关性&gt&semi;

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

  6. 2000条你应知的WPF小姿势 基础篇&lt&semi;74-77 WPF 多窗口Tips&gt&semi;

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

  7. 2000条你应知的WPF小姿势 基础篇&lt&semi;69-73 WPF Freeze机制和Template&gt&semi;

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

  8. 2000条你应知的WPF小姿势 基础篇&lt&semi;45-50 Visual Tree&amp&semi;Logic Tree 附带两个小工具&gt&semi;

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

  9. 2000条你应知的WPF小姿势 基础篇&lt&semi;34-39 Unhandled Exceptions和Resource&gt&semi;

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

随机推荐

  1. HTML自定义对象与属性(谷歌,火狐,IE9浏览器没问题)

    1.自定义标签 <zqz>asdas</zqz> <style> zqz{ color:red; } </style> 页面变色 2.自定义标签的hov ...

  2. MySQL学习笔记01&lowbar;数据库基础知识

    01_1 mysql数据库启动与停止 以<管理员权限>启动cmd: 输入net stop mysql停止mysql服务: 输入net start mysql启动mysql服务: 输入mys ...

  3. JS 的事件委托机制

    以前写上图所示的鼠标点击触发事件,一般都是用如下所示的给每一个表示列表的标签绑定一个click事件(演示用的例子的框架是React): 毫无疑问,这样是比较繁琐的,以后维护修改改个函数名什么的还不方便 ...

  4. 一个公网地址部署LVS&sol;DR模式

    http://blog.chinaunix.net/uid-7411781-id-3436142.html 一个公网地址部署LVS/DR模式   网上看了很多关于LVS的文章,在选取2种模式LVS/D ...

  5. UI&lowbar;拖动View

    方法一 在touchesMoved中 // 获取到触摸的手指 UITouch *touch = [touches anyObject]; // 获取集合中对象 // 获取開始时的触摸点 CGPoint ...

  6. 史上最全常用正则表达式&lpar;Javascript公众号推文&rpar;

    2017-04-13 zxin JavaScript很多不太懂正则的朋友,在遇到需要用正则校验数据时,往往是在网上去找很久,结果找来的还是不很符合要求.所以我最近把开发中常用的一些正则表达式整理了一下 ...

  7. iptables 防火墙日常

    . 检查机目标机器 httpd 服务/etc/init.d/httpd status ========================================================= ...

  8. SpringBoot集成MongoDB

    前言 之前写了各种nosql数据库的比较,以及相关理论,现在我在本地以springboot+MongoDB框架,探究了具体的运行流程,下面总结一下,分享给大家. 运行前准备 安装并启动MongoDB应 ...

  9. Go语言类型转换库【github&period;com&sol;demdxx&sol;gocast】的用法

    一.导入库: go get github.com/demdxx/gocast 二.测试代码: // main.go package main import ( "fmt" &quo ...

  10. 猫咪记单词——NABCD模型分析

    N ——Need 需求:学习英语是一件非常重要的事.面对各种各样的考试,学习英语,最重要的就是词汇量,背单词是提高词汇量的最直接的方法,但是单纯的背单词太单调.寻找一些合适的,更易于接受的背单词学习英 ...