首先,我们先来大概了解一下依赖属性

什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值。

依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费。所以用依赖属性,用不着就不用,用得着就用。

怎么声明依赖属性:用public static readonly三个修饰符修饰。

怎么声明实例:使用DependencyProperty.Register方法生成。此方法有三个参数跟四个参数。

怎么操作依赖属性的值:利用依赖对象(Dependency Object)的GetValue、SetValue方法实现。

现在,我们用代码来实现一下依赖属性:

XAML

<Window x:Class="DependecyProperty.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DependecyProperty"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox />
<TextBox x:Name="testTB"/>
</StackPanel>
</Window>

  声明依赖属性与引用

  public class Student : DependencyObject
{ /// <summary>
/// 声明依赖属性
/// </summary>
// Using a DependencyProperty as the backing store for NameProperty. This enables animation, styling, binding, etc...
public static readonly DependencyProperty NamePropertyProperty =
DependencyProperty.Register("NameProperty", typeof(string), typeof(Student)); }
引用

public MainWindow()
{
InitializeComponent();
//实例化类
Student stu = new Student();
//给依赖属性赋值
stu.SetValue(Student.NamePropertyProperty,"dfsdfsd");
//获取依赖属性的值
testTB.Text = stu.GetValue(Student.NamePropertyProperty).ToString();
}

运行程序则成功获取依赖属性的值。但不能直接在xaml中得到依赖属性的值?我们可以绑定依赖属性到文本框上

<Window x:Class="DependecyProperty.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
xmlns:local="clr-namespace:DependecyProperty"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox />
<!--当依赖属性改变时,文本框的字符也得到通知,实时改变 -->
<TextBox x:Name="testTB" Text="{Binding NameProperty,Mode=TwoWay}"/>
</StackPanel>
</Window>

  在后置代码处绑定数据

 //实例化类
Student stu = new Student();
this.DataContext = stu;

  则成功获取依赖属性

可能到此处就有人问了,声明依赖属性打这么多字很麻烦,有没有方便的方法?可以通过打propdp然后按两次tab键,visual studio会自动生成依赖属性,自动生成的依赖属性的DependencyProperty.Register

(可能有观察力强的人问,新增依赖属性会产生这么多错误吗?因为途中有多个错误信息。其实这些错误是我在命名空间中声明依赖属性导致的,这是个错误的示范,无视即可)

依赖属性应用于什么场景?

依赖属性可用于场景不断变化的场景,比如一个按钮的文字在不同情况下变化。这种情况我们可以继承接口INotifyPropertyChanged,然后声明属性的变化通知。不过相对依赖属性来说,它的性能成本高,所以这样的情况就可以使用依赖属性。其它类需要使用此依赖属性的时候 ,也可以借用。一般依赖属性的应用场景是自定义控件。

  

说说WPF的依赖属性的更多相关文章

  1. WPF的依赖属性

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

  2. wpf 的依赖属性只能在loaded 事件之后才能取到

    wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的  InitializeComponent(); 之后取不到 wpf 的依赖属性只能在loaded 事件之后才能取到,在构造函数的  ...

  3. WPF 中依赖属性的继承(Inherits)

    WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点.例如,数据绑定中经常使用的DataContextProperty: var host ...

  4. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  5. WPF的依赖属性和附加属性(用法解释较全)

    转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...

  6. WPF利用依赖属性和命令编写自定义控件

    以实例讲解(大部分讲解在代码中) 1,新建一个WPF项目,添加一个用户控件之后在用户控件里面添加几个控件用作测试, <UserControl x:Class="SelfControlD ...

  7. WPF: 只读依赖属性的介绍与实践

    在设计与开发 WPF 自定义控件时,我们常常为会控件添加一些依赖属性以便于绑定或动画等.事实上,除了能够添加正常的依赖属性外,我们还可以为控件添加只读依赖属性(以下统称"只读属性" ...

  8. WPF 自定义依赖属性

      原博客地址:http://www.cnblogs.com/DebugLZQ/archive/2012/11/30/2796021.html    DependencyObject和Dependen ...

  9. [转]WPF的依赖属性是怎么节约内存的

    WPF升级了CLR的属性系统,加入了依赖属性和附加属性.依赖属性的使用有很多好处,其中有两点是我认为最为亮眼的: 1)节省内存的开销; 2)属性值可以通过Binding依赖于其它对象上,这就使得我的数 ...

  10. WPF 之 依赖属性与附加属性(五)

    一.CLR 属性 ​ 程序的本质是"数据+算法",或者说用算法来处理数据以期得到输出结果.在程序中,数据表现为各种各样的变量,算法则表现为各种各样的函数(操作符是函数的简记法). ...

随机推荐

  1. Markdown 入门

    一. Markdown语法的简要规则 标题 标题是非常重要的一个标记,一段文字标记为标题,只需要在文字前加 #.具体可以支持到1到6个# 1 2 3 4 # 一级标题 ## 二级标题 ### 三级标题 ...

  2. WPF四年,尤不足以替代WinForm

    WPF四年,尤不足以替代WinForm WPF出山已四年,作为官方内定的下一代UI系统掌门,没少露脸.但这个新掌门能否胜任,仍是众多开发者的心头之虑.通过对VisualStudio 2010的编辑器部 ...

  3. FreeCL

    FreeCL 1.03(Free Control Library)是一个开源且免费的Windows控件库,它属于3D图形引擎FreeGE中的一部分,用户可以自由地用于个人或商业开发.FreeCL使用类 ...

  4. ASP.NET Web API 直到我膝盖中了一箭【1】基础篇

    蓦然回首,那些年,我竟然一直很二. 小时候,读武侠小说的时候,看到那些猪脚,常常会产生一种代入感,幻想自己也会遭遇某种奇遇,遇到悬崖跳下去是不是有本“武林秘笈”在等着?长大以后也是一样,多少人梦着醒着 ...

  5. android 写文件到sd卡问题小记

    android 写文件到sd卡问题小记 事情是这样子的.... 这天我开始编写项目调试工具,高大上不?-----其实就是记录实时网络请求和崩溃日志相关等的小工具(此处一个会心的微笑). 然后我是这样写 ...

  6. mogodbshell中数组对象查询修改方法

    在mongodb中,存在如下数据 { "_id" : ObjectId("59af55078a8fc5e51ff425de"), "title&quo ...

  7. Spring Boot:实现MyBatis动态创建表

    综合概述 在有些应用场景中,我们会有需要动态创建和操作表的需求.比如因为单表数据存储量太大而采取分表存储的情况,又或者是按日期生成日志表存储系统日志等等.这个时候就需要我们动态的生成和操作数据库表了. ...

  8. LCN自动补偿

    LCN自动补偿 1当出现需要补偿的数据的时候,LCN将请求tm.compensate.notifyUrl配置的通知地址, 请求补偿的样例数据格式: {"groupId":" ...

  9. sentinel 滑动窗口统计机制

    sentinel的滑动窗口统计机制就是根据当前时间,获取对应的时间窗口,并更新该时间窗口中的各项统计指标(pass/block/rt等),这些指标被用来进行后续判断,比如限流.降级等:随着时间的推移, ...

  10. EhCache注解 (转载)

    其实EhCache使用的就是Spring Cache的注解. 1.1 @Cacheable @Cacheable可以标记在一个方法上,也可以标记在一个类上.当标记在一个方法上时表示该方法是支持缓存的, ...