深入浅出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:这方面也不是我的优势,幸好我有博客园,能记录一 ...
随机推荐
- prism 的学习网站
C#的学习网址: https://www.cnblogs.com/zh7791
- 测试框架unit之assertion断言使用详解
NUnit是.Net平台的测试框架,广泛用于.Net平台的单元测试和回归测试中,下面我们用示例详细学习一下他的使用方法 任何xUnit工具都使用断言进行条件的判断,NUnit自然也不例外,与其它的xU ...
- dataTemplate 使用
App ----------------------------------------------------------------- <Application x:Class=" ...
- 修改anaconda3 jupyter notebook 默认路径
本文参考了: https://blog.csdn.net/u014552678/article/details/62046638 https://blog.csdn.net/qigenhuochai/ ...
- ES6扩展运算符(三点运算符)...的用法
1. 第一个叫做 展开运算符(spread operator),作用是和字面意思一样,就是把东西展开.可以用在array和object上都行. let a = [1,2,3]; let b = [0, ...
- vue 引用省市区三级联动(element-ui select)
npm 下载 axios npm install --save axios static 静态文件夹里 创建 json 文件夹 json 文件夹里创建 map.json map.json 文件里写 ( ...
- 手写AVL平衡二叉搜索树
手写AVL平衡二叉搜索树 二叉搜索树的局限性 先说一下什么是二叉搜索树,二叉树每个节点只有两个节点,二叉搜索树的每个左子节点的值小于其父节点的值,每个右子节点的值大于其左子节点的值.如下图: 二叉搜索 ...
- [考试总结]noip模拟43
这个题目出的还是很偷懒.... 第一题...第二题...第三题...四.... 好吧... 这几次考得都有些问题,似乎可能是有些疲惫,脑袋也是转不太动,考完总觉得自己是能力的问题,但是改一分钟之后会发 ...
- rtl8188eu 驱动移植
测试平台 宿主机平台:Ubuntu 16.04.6 目标机:iMX6ULL 目标机内核:Linux 4.1.15 rtl8188eu 驱动移植 在网上下载Linux版的驱动源码: wifi驱动的实现有 ...
- Redis哨兵机制的实现及与SpringBoot的整合
1. 概述 前面我们聊过Redis的读写分离机制,这个机制有个致命的弱点,就是主节点(Master)是个单点,如果主节点宕掉,整个Redis的写操作就无法进行服务了. 为了解决这个问题,就需要依靠&q ...