WPF学习(三) - 依赖属性
学习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 ) ); }
依赖属性的使用例子
通过这个例子,我的认识是:想把展示层的属性值同步给数据层,必须用依赖属性。SetBinding方法第二个参数要求必须是依赖属性类型。
在上一篇中,用Winform实现数据同步的方法,建立同步关系过程存在不足。而WPF使用依赖属性,解决了这个难题。
那么,依赖属性是如何神奇地做到这一点的呢?之前,我说过,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方法,传入实例和属性名,读、写这个实例对应的属性值,似乎可以用了呢。其实,这就是在骗人,我从来就没有真正的读/写过这个实例的属性值(如果他真的是那种传统意义上的类和属性实例化出来的),我一直在用一个替身保存我想保存在属性字段中的值。甚至于,这个实例所在的类根本就没有这个字段。
明白这些的时候,十分怒火。用了这么多年的面向对象,如今,类的属性不再需要定义字段去存储,它们在运行时被归拢到一堆,放在一口锅里。对象已不再是那个对象,它可以只保留那12个字节,刷个存在感。类与类之间还有关系吗?对象与对象之间还有关系有吗??!!!还设计什么架构,还搞什么数据结构。随便定义个空类,运行去吧,想添啥属性随意添。
曾经有个小朋友,这样设计数据表结构:表名、字段名、记录编号、字段值,还很沾沾自喜的向我炫耀自己设计了一个通用的表结构。我一巴掌抽过去,科班出身的人把数据结构学到狗身上去了!如今,微软一巴掌抽回来,这么任性的结构,.net也要用,咋地吧!!!
怒了,今天就到这……
WPF学习(三) - 依赖属性的更多相关文章
- WPF学习笔记——依赖属性(Dependency Property)
1.什么是依赖属性 依赖属性是一种可以自己没有值,并且通过Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象被称为"依赖对象". 依赖项属性通过调用 Regi ...
- WPF中的依赖属性
1. WPF中的依赖属性 依赖属性是专门基于WPF创建的.在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使用方法与普通的属性是相同的. 1.1 依赖属性提供的属性功能 资源 数据绑定 样式 ...
- WPF 精修篇 依赖属性
原文:WPF 精修篇 依赖属性 依赖属性使用场景 1. 希望可在样式中设置属性. 2. 希望属性支持数据绑定. 3. 希望可使用动态资源引用设置属性. 4. 希望从元素树中的父元素自动继承属性值. 5 ...
- WPF教程:依赖属性
一.什么是依赖属性 依赖属性就是一种自己可以没有值,并且可以通过绑定从其他数据源获取值.依赖属性可支持WPF中的样式设置.数据绑定.继承.动画及默认值. 将所有的属性都设置为依赖属性并不总是正确的解决 ...
- (原创)2. WPF中的依赖属性之二
1 依赖属性 1.1 依赖属性最终值的选用 WPF属性系统对依赖属性操作的基本步骤如下: 第一,确定Base Value,对同一个属性的赋值可能发生在很多地方.还用Button的宽度来进行举例,可能在 ...
- [No000012D]WPF(5/7)依赖属性
介绍 WPF带来了很多传统 Windows 应用程序没有的新特性和选择.我们已经讨论了一些 WPF 的特性,是时候更进一步介绍其他特性了.当你读完这个系列之前的文章,我希望你已经或多或少地了解了 WP ...
- 【转】【WPF】关于依赖属性的ValidateValueCallback,PropertyChangedCallback和CoerceValueCallback的执行顺序
三个回调对应依赖属性的验证过程,改变过程和强制转换过程. class Dobj : DependencyObject { //依赖属性包装 public int MyProperty { get { ...
- WPF usercontrol 自定义依赖属性
1.依赖属性不同意一般属性,一般属性主要定义在对象中,而依赖属性是存在一个特殊的依赖属性表中.2.当我们触发改变值时,需要通过SetValue这种方式进行触发. UserControl1.xaml: ...
- WPF 主动触发依赖属性的 PropertyChanged
需求背景 需要显示 ViewModel 中的 Message/DpMessage,显示内容根据其某些属性来确定.代码结构抽象如下: // Model public class Message : IN ...
- WPF快速入门系列(2)——深入解析依赖属性
一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...
随机推荐
- [Javascript] 层控制(隐藏、显示、卷起、展开)
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/ ...
- Redis常用的命令
常规命令查询地址: http://redisdoc.com/ 如下图:
- docker compose线下安装
Compose 是一个用户定义和运行多个容器的 Docker 应用程序.在 Compose 中你可以使用 YAML 文件来配置你的应用服务.然后,只需要一个简单的命令,就可以创建并启动你配置的所有服务 ...
- asp.net 后台给前台控件添加及设置属性
txtTopImgBox.Attributes.Add("title", "12312121"); Text1.Style["background-c ...
- form&method【POST~GET】
<form.../>中method属性指定了该表单是以哪种方式提交请求,有两种方式:GET请求方式和POST请求方式,默认是GET请求方式.两种方式的区别:get方式的请求是在浏览器地址栏 ...
- spring mvc 项目 相关配置文件小结
web.xml文件主要配置如下: 需要加载的配置文件: 类路径下,可以使用通配符配置 类似:classpath:conf/spring/*/*.xml, <context-param> ...
- [C#学习笔记之异步编程模式2]BeginInvoke和EndInvoke方法 (转载)
为什么要进行异步回调?众所周知,普通方法运行,是单线程的,如果中途有大型操作(如:读取大文件,大批量操作数据库,网络传输等),都会导致方法阻塞,表现在界面上就是,程序卡或者死掉,界面元素不动了,不响应 ...
- thinkphp 5 count()方法在控制器,模板中的使用方法
thinkphp中关于count()方法的使用: 控制器中:echo count($arr)模板中:{$arr | count}模板中if判断语句中 <if condition="co ...
- day10 强制类型转换(更新)
目录 强制类型转换 int() str() list() tuple() set() dict() 总结 强制类型转换 直接看总结 # 定义各个数据类型的值 num_int = 123 num_flo ...
- luoguP1002
p1002 题意: 从坐标A到坐标B的可能路线(有一些点不能走)情况,很明显可以看出用dp做 m[i][j]=m[i-1][j]+m[i][j-1](注意处理不能走的点) 自己在初始化时犯了错,第1行 ...