深入浅出WPF-07.Property(属性)
依赖属性
1)字段与属性:字段被封装在实例中,要么能够被外界访问(非Private),要么不能够被外界访问(Private)。但是我们直接把数据暴露给外界的做法不安全,容易把错误的数据写入字段。于是我们使用一对非Private的方法包装一下。使用Set进行赋值(可以进行验证和判断数据的有效性),使用Get方法把字段的数据读取出来。
2)依赖属性(Dependency Property)
依赖属性是一个自己可以自己没有值,并能够通过绑定从数据源获得值(依赖在别人身上)的一种属性。和传统的CLR属性相比,有一些特点:1)节省实例对内存的开销,2)属性值可以通过Binding依赖在其他对象上。
传统的.Net开发中,一个对象所占用的内存空间在调用new操作符进行实例初始化时,就已经决定了。而WPF允许对象在被创建的时候并不包含用于存储数据的空间、只保留在需要用到数据时能够获得默认值、借用其他对象数据或者实时分配空间的能力,这种对象就称为依赖对象。而他这种实时获取数据的能力则依靠依赖属性来实现。在WPF开发中,必须使用依赖对象作为依赖属性的宿主,使二者结合起来,才能形成完整的Binding目标被数据驱动。
3)声明和使用依赖属性
demo上代码:
public static readonly DependencyProperty VersionProperty = DependencyProperty.Register(
"Version", typeof(string), typeof(AboutWindow), new PropertyMetadata(default(string)));
public string Version
{
get => (string)GetValue(VersionProperty);
set => SetValue(VersionProperty, value);
}
用一句话概括DependencyProperty对象的创建和注册:创建一个DependencyProperty实例并用它的CLR属性名和宿主类型名生成hash code,最后把hash code和DependencyProperty实例作为Key-Value对存入全局的、名为PropertyFromName的HashTable中。这样WPF属性系统通过CLR属性和宿主类型名就可以从全局的Hashtable中检索出对应的DependencyProperty实例。
注意:把DependencyProperty实例注册进全局的Hashtable时使用的key是由CLR属性名哈希值和宿主类型哈希值经过运算得到的,但这并不是DependencyProperty实例的哈希值。每个DependencyProperty实例都具有一个名为GlobleIndex 的int类型属性,GlobleIndex的值是经过一些算法得到的,确保每个DependencyProperty实例的GlobleIndex是唯一的。
附加属性
附加属性是说一个属性本身不属于某个对象,但由于某种需求而被后来附加上的。也就是把对象放入一个特殊环境后对象才具有的属性就称为附加属性。
典型的附加属性就是设置一个文本框的行列值:
<Grid Grid.Row="1" Grid.Column="1" Background="{StaticResource WindowsButtonSpaceVBrush}" Margin="0,0,0,15"/>
对一个对象设置附加属性:
public class School : DependencyObject
{
/// <summary>
/// 检查结果
/// </summary>
public static readonly DependencyProperty ResultTypeProperty = DependencyProperty.RegisterAttached("Result", typeof(ResultDtoBase), typeof(School), new PropertyMetadata(null, ResultPropertyChanged));
public ResultDtoBase Result { get => (ResultDtoBase)GetValue(ResultTypeProperty); set => SetValue(ResultTypeProperty, value); }
/// <summary>
/// 属性改变
/// </summary>
/// <param name="dobj"></param>
/// <param name="e"></param>
static void ResultPropertyChanged(DependencyObject dobj, DependencyPropertyChangedEventArgs e)
{
Debug.WriteLine(string.Format("PropertyChanged - 属性:{0} 新值:{1} 旧值:{2}", e.Property.Name, e.NewValue, e.OldValue));
}
}
从代码结构上看,此处的附加属性和依赖属性基本创建方法基本一致。
深入浅出WPF-07.Property(属性)的更多相关文章
- Wpf之Xaml属性值和特性值(一)
其实我一直很好奇在xaml中,通过Attribute=Value这种方式可以进行对元素的描述, 例如: <Rectangle Name=” rectangle” Fill=”Blue”/> ...
- 《深入浅出WPF》 学习笔记
<深入浅出WPF> 序言 1. 什么是WPF 2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新 ...
- [转]深入浅出WPF(7)——数据的绿色通道,Binding
本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己 ...
- 《深入浅出WPF》笔记——模板篇
原文:<深入浅出WPF>笔记--模板篇 我们通常说的模板是用来参照的,同样在WPF中,模板是用来作为制作控件的参照. 一.认识模板 1.1WPF菜鸟看模板 前面的记录有提过,控件主要是算法 ...
- WPF DataGrid常用属性记录
WPF DataGrid常用属性记录 组件常用方法: BeginEdit:使DataGrid进入编辑状态. CancelEdit:取消DataGrid的编辑状态. CollapseRowGroup:闭 ...
- 《深入浅出WPF》笔记一
1.项目模板 Visual Studio自动配置编译器参数,并准备好一套基本的源代码. 2.App.xaml/App.xaml.cs 声明程序的进程,并指定程序的主窗体. 3.Attribute和Pr ...
- 深入浅出WPF(1)—转(http://liutiemeng.blog.51cto.com/120361/91631/)
深入浅出WPF(1)——什么是WPF 2008-05-15 19:06:00 小序: Hi,大家好!几乎两个月没有写技术文章了.这两个月,我在学习WPF.回顾一下两个月的学习历程,有两个感觉— ...
- WPF的依赖属性
Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...
- 【【分享】深入浅出WPF全系列教程及源码
】
因为原书作者的一再要求,在此声明,本书中的部分内容引用了原书名为<深入浅出WPF>的部分内容,假设博文不能满足你现有的学习须要,能够购买正版图书! 本人10月份提出离职,可是交接非常慢,预 ...
- 《深入浅出WPF》笔记——绘画与动画
<深入浅出WPF>笔记——绘画与动画 本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...
随机推荐
- mybatis主配置文件详解
mybatis主配置文件 <?xml version="1.0" encoding="UTF-8" ?> <!DOCTYPE configur ...
- 关于struts中Ognl和iterator配合再次理解
Person.jsp (struts.xml中省略) package com.mzy.entity; public class Person { private String name; privat ...
- Flink 保证ExactlyOnce
Flink 保证 ExactlyOnce 1.使用执行ExactlyOnce 的数据源,比如 kafka 2.使用FlinkConsumer,开启CheckPointing,偏移量会保存通过Check ...
- myScript调研,电子手写板使用,纯干货
第二天进公司,就叫我调研myScript作为手写板的可行性,又不能不做,哎~ myScript效果十分的奈斯,前端用canvas手写的文字.数学字符,都可以识别然后转换,不知道myScript是不是你 ...
- 【WPF】 OxyPlot图表控件学习
最近在学习OxyPlot图表控件,一些基本的学习心得,在这里记录一下,方便以后进行查找. 一.引用 OxyPlot控件可以直接在VS的 " Nuget " 里面下载 选择: ...
- Java并发之AQS原理解读(一)
前言 本文简要介绍AQS以及其中两个重要概念:state和Node. AQS 抽象队列同步器AQS是java.util.concurrent.locks包下比较核心的类之一,包括AbstractQue ...
- Linux centos7 scp命令
1. 命令简介 scp(secure copy) 是 linux 系统下基于 ssh 登陆进行安全的远程文件拷贝命令,可以在两台 Linux 主机进行复制操作 # 语法 scp [-1246BCpqr ...
- Docker容器管理——Docker容器常用命令
1.查看所有的容器 docker ps 2.查看运行的容器 docker ps -a 3.启动.停止.重启docker容器 docker start ... docker stop ... docke ...
- shell循环语句until
until 条件 do 执行命令 done until 循环与 while 循环在处理方式上刚好相反. 当条件成立的时候,停止循环.
- JAVA安全基础之反射
JAVA安全基础之反射 在JAVA安全中,反射是一个经常使用的技术,所以熟悉使用反射是非常必要的.下面就简单的讲下JAVA的反射的用法 什么是反射 每个类都有对应的Class类对象,该Class类对象 ...