依赖属性

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(属性)的更多相关文章

  1. Wpf之Xaml属性值和特性值(一)

    其实我一直很好奇在xaml中,通过Attribute=Value这种方式可以进行对元素的描述, 例如: <Rectangle Name=” rectangle” Fill=”Blue”/> ...

  2. 《深入浅出WPF》 学习笔记

    <深入浅出WPF> 序言 1. 什么是WPF    2. 为什么要学习WPF 第一章 XAML概览 1. XAML是什么? 2. XAML有哪些优点 第二章 从零起步认识XAML 1. 新 ...

  3. [转]深入浅出WPF(7)——数据的绿色通道,Binding

    本文转自:http://liutiemeng.blog.51cto.com/120361/95273 小序: 怎么直接从2蹦到7啦?!啊哦,实在是不好意思,最近实在是太忙了,忙的原因也非常简单——自己 ...

  4. 《深入浅出WPF》笔记——模板篇

    原文:<深入浅出WPF>笔记--模板篇 我们通常说的模板是用来参照的,同样在WPF中,模板是用来作为制作控件的参照. 一.认识模板 1.1WPF菜鸟看模板 前面的记录有提过,控件主要是算法 ...

  5. WPF DataGrid常用属性记录

    WPF DataGrid常用属性记录 组件常用方法: BeginEdit:使DataGrid进入编辑状态. CancelEdit:取消DataGrid的编辑状态. CollapseRowGroup:闭 ...

  6. 《深入浅出WPF》笔记一

    1.项目模板 Visual Studio自动配置编译器参数,并准备好一套基本的源代码. 2.App.xaml/App.xaml.cs 声明程序的进程,并指定程序的主窗体. 3.Attribute和Pr ...

  7. 深入浅出WPF(1)—转(http://liutiemeng.blog.51cto.com/120361/91631/)

    深入浅出WPF(1)——什么是WPF 2008-05-15 19:06:00   小序:   Hi,大家好!几乎两个月没有写技术文章了.这两个月,我在学习WPF.回顾一下两个月的学习历程,有两个感觉— ...

  8. WPF的依赖属性

    Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR)属性的功能,这些服务通常统称为 WPF 属性系统.由 WPF 属 ...

  9. 【【分享】深入浅出WPF全系列教程及源码 】

    因为原书作者的一再要求,在此声明,本书中的部分内容引用了原书名为<深入浅出WPF>的部分内容,假设博文不能满足你现有的学习须要,能够购买正版图书! 本人10月份提出离职,可是交接非常慢,预 ...

  10. 《深入浅出WPF》笔记——绘画与动画

    <深入浅出WPF>笔记——绘画与动画   本篇将记录一下如何在WPF中绘画和设计动画,这方面一直都不是VS的强项,然而它有一套利器Blend:这方面也不是我的优势,幸好我有博客园,能记录一 ...

随机推荐

  1. 使用VSCode创建第一个VUE项目

    vue init webpack vue_test回车,然后输入工程名称vue_test vue:Missing space before value for key 'components' 原因是 ...

  2. servlet通过响应头Content-Disposition实现文件下载效果

    package day08; import java.io.File; import java.io.FileInputStream; import java.io.IOException; impo ...

  3. 在PyQt中构建 Python 菜单栏、菜单和工具栏

    摘要:菜单.工具栏和状态栏是大多数GUI 应用程序的常见且重要的图形组件.您可以使用它们为您的用户提供一种快速访问应用程序选项和功能的方法. 本文分享自华为云社区<Python 和 PyQt:创 ...

  4. 笔记本+ubuntu18.04 关闭触摸板touchpad

    方法1: Settings -> Devices -> Mouse&Touchpad -> Touchpad OFF 方法2: 终端运行如下命令 touchpad off:  ...

  5. seo高手教你seo优化排名该怎么做

    seo高手教你seo优化排名该怎么做 第一节:如何在本地搭建服务器环境 本节课程主要是讲如何利用 Xampp在本地搭建服务器环境 .网站使用asp和php比较常见,当然,就目前而言,使用php搭建网站 ...

  6. Java网络编程之TCP

    Java网络编程之TCP ​ TCP主要需要两个类:Socket和ServerSocket,Socket是客户端连接服务器时创建,参数需要指定服务器的ip和端口,ServerSocket是服务器端创建 ...

  7. uniapp 设置背景图片

    uniapp 由于其特殊机制,导致了背景图片不能引用本地图片.只能通过 转成 base64 来进行设置 附上链接:https://oktools.net/image2base64 图片转成base64 ...

  8. 华为分析X HUAWEI Ads,上线深度转化事件回传功能,让ROI 看得见!

    华为分析X HUAWEI Ads,上线深度转化事件回传功能,让ROI 看得见! 随着移动应用生态的流量成本攀升.行业竞争加剧,越来越多的广告商希望通过精准投放来获取更高质量的深度转化用户,比如二手车. ...

  9. Python之requests模块-request api

    requests所有功能都能通过"requests/api.py"中的方法访问.它们分别是: requests.request(method, url, **kwargs) req ...

  10. Hystrix集群及监控turbine

    Hystrix集群及监控turbine 前面Dashboard演示的仅仅是单机服务监控,实际项目基本都是集群,所以这里集群监控用的是turbine. turbine是基于Dashboard的. 先搞个 ...