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中一个最 ...
随机推荐
- springboot的常见配置
1.Springboot热部署 热部署的意思就是当任何类发生改变时,通过JVM类加载的方式加载到虚拟机上,这样就不需要我们重启Application类了 做法: 1)添加一个依赖到pom.xml上: ...
- 在.NetCore2.0中使用Swagger
一.新建.netCore webapi项目 二.安装swagger ,通过 Package Manager 控制台:Install-Package SwashBuckle.AspNetCore -Pr ...
- jquery中$each()
$.each():可用于遍历任何的集合(无论是数组或对象) $(selector).each():专用于jquery对象的遍历, 如果是数组,回调函数每次传入数组的索引和对应的值(值亦可以通过this ...
- JEE Spring-boot 简单的ioc写法。
什么是ioc,就是你可能会有一些生活必需品,这些东西你必须要用才能存活.但是你不是每天都回去买,去哪一家点去买.而这些用品会一直放在哪里,每一个商店就是一个容器,包裹着这些物品. 创建ioc项目,首先 ...
- 杭电 4508 湫湫系列故事——减肥记I【完全背包】
解题思路:因为食物是可以随便吃的,所以是完全背包,卡路里代表消耗,幸福感代表价值,套公式就可以做了. Problem Description 对于吃货来说,过年最幸福的事就是吃了,没有之一! 但是对于 ...
- 使用 Sublime 或其他编辑器调试 Tampermonkey 油猴脚本
作者说由于 Chrome 安全限制,没办法调用外部编辑器调试,但提供了一个间接办法,那就是脚本中使用@require file:///引入本地文件的形式,具体的方法是 打开 chrome://exte ...
- 获取浏览器端的cookie方法
代码如下: function getCookie(key){ var cookies=document.cookie; if(cookies.length>0){ var start=cooki ...
- 基础——(4)SR Latch(SR锁存器)
Digital logic gets really interesting when we connect the output of gates back to an input. The SR l ...
- 实现js保留小数点后N位的代码
在JS中,一般实现保留小数点后N位的话,都是利用toFixed函数 <script language="javascript"> document.write(&quo ...
- js原生api之String的slice方法
我们在工作中可能会很少进行这样的思考,对于一些常用的原生api它是如何实现的呢,如果让我们去用js实现一个与原生api功能相同的函数我们该如何设计算法去实现呢? 为了巩固自己的编程技术和提高自己的编程 ...