当前位置:首页 > Windows程序 > 正文

WPF学习(三) - 依赖属性和附加属性

2021-05-25 Windows程序

  学习WPF时,我在看一本叫做“深入浅出WPF”的书。整整20页都在讲依赖性性和附加属性,反复看了几遍居然还是不懂,真是郁闷。

  上一篇中WPF绑定的例子,其实已经用到了依赖属性。

// 作为被绑定的目标类,必须从DependencyObject派生 // 这样定义的类才能满足SetBinding方法的第一个参数的类型要求 // 还要额外定义一个依赖属性,用来满足SetBinding方法的第二个参数要求 // 用DependencyObject派生方法GetValue和SetValue,控制属性的存、取 public class UIClass : System.Windows.DependencyObject { public string MyText { get { return ( string ) GetValue ( MyTextProperty ); } set { SetValue ( MyTextProperty, value ); } } public static readonly System.Windows.DependencyProperty MyTextProperty = System.Windows.DependencyProperty.Register ( "MyText", typeof ( string ), typeof ( UIClass ) ); }

依赖属性的使用例子

  从这里,我的认识是:想把展示层的属性值同步给数据层,必须用依赖属性。

  另外,在上一篇中,用Winform实现绑定的方法,其实现过程存在不足。而WPF使用依赖属性这个技术,解决了Winform的问题。

  那么,依赖属性是如何神奇地做到这一点的呢?之前,我说过,Winform实现很困难,但不等于实现不了,这个命题是这样的:

  已知:某个实例和它的属性名称字符串,如何获取这个实例的这个属性值?注意,这个要求不是在编码阶段,而是在运行阶段实现的功能。

GetObjectPropertyValue(object o, string propertyName) //返回属性值

  不许用反射!!!事实上,这么个简单的要求,我居然做不到……这不能不让我想起最初接触编程时,总是用替代的办法,实现一些标准的功能。这次还是要用替代的办法来解决问题。反正要求就是按名称取一个值,我建立一个名称+值的对照表,这样就实现了按名称存/取属性值了。好吧,还有实例也要刷下存在感,对照表里加一项,描述实例。

public class PropertyContainer { static List<InstanceNameValue> lstINV = new List<InstanceNameValue> ( ); public void Register ( int instance, string propertyName) { lstINV.Add ( new InstanceNameValue ( ) { InstanceHashCode = instance, PropertyName = propertyName } ); } public object GetValue ( object o, string propertyName ) { foreach ( InstanceNameValue item in lstINV ) { if ( o.GetHashCode ( ) == item.InstanceHashCode && propertyName == item.PropertyName ) { return item.Value; } } return null; } } //实例、属性名、值 class InstanceNameValue { public int InstanceHashCode; public string PropertyName; public object Value; }

属性容器

public class CheatClass { public string CheatProperty { get { return (string)PropertyContainer.GetValue ( this, "WhatEverName" ); } } }

虚伪的类、虚假的属性

  调用PropertyContainer.GetValue方法,传入实例和属性名,读、写这个实例对应的属性值,似乎可以用了呢。其实,这就是在骗人,我从来就没有真正的读/写过这个实例的属性值(如果他真的是那种传统意义上的类和属性实例化出来的),,我一直在用一个替身保存我想保存在属性字段中的值。甚至于,这个实例所在的类根本就没有这个字段。

温馨提示: 本文由Jm博客推荐,转载请保留链接: https://www.jmwww.net/file/70663.html