1、什么是依赖属性

依赖属性是一种可以自己没有值,并且通过Binding从数据源获得值(依赖在别人身上)的属性,拥有依赖属性的对象被称为“依赖对象”。

依赖项属性通过调用 Register 方法(或 RegisterReadOnly)在 WPF 属性系统中注册,并通过 DependencyProperty 标识符标示属性。 依赖项属性只能由继承自 DependencyObject 类的类型使用,在WPF中大部分的类都可以支持依赖属性。

2、DependencyObject和DependencyPorperty

DependencyObject和DependencyPorperty两个类是WPF属性系统的核心

在WPF中,依赖对象的概念被DependencyObject类实现;依赖属性的概念则由DependencyProperty类实现

必须使用依赖对象作为依赖属性的宿主,二者结合起来,才能实现完整的Binding目标被数据所驱动。DependencyObject具有GetValue和SetValue两个方法,用来获取/设置依赖属性的值。

DependencyProperty实例的声明特点——引用变量由public static readonly三个修饰符修饰,实例不是new 操作符得到,而是调用DependencyProperty.Register方法生成。(见实例代码)

3、示例代码

<Window x:Class="DependencyPropertyDemo.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:DependencyPropertyDemo"
mc:Ignorable="d"
Title="MainWindow" Height="350" Width="525">
<StackPanel>
<TextBox x:Name="textBox1" BorderBrush="Black" Margin="5"/>
<TextBox x:Name="textBox2" BorderBrush="Black" Margin="5" Text="{Binding Path=Text, ElementName=textBox1,Mode=OneWay}"/>
<Button Margin="5" Content="OK" Click="Button_Click"/>
</StackPanel>
</Window>

声明一个Student类,继承DependencyObject,在里面声明一个属性,即依赖属性,命名规则是要以Property结尾。

为了方便使用,给他声明了一个Name属性,set中调用SetValue()方法设置Name,get中调用GetValue()方法获取Name。

  public class Student:DependencyObject
{
    

/// <summary>
/// Register方法中各参数说明
/// 第一个参数为string类型,指明以那个CLR属性作为依赖属性的包装器,这里是Name,已经实现CLR属性的包装
/// 第二各参数为Type类型,用来指明次依赖属性用来存储什么类型的值
/// 第三个参数为Type类型,指明依赖属性宿主类型,或者说DependencyProperty.Register放啊分将把这个依赖属性关联到哪个类型上。
/// </summary>

public static readonly DependencyProperty NameProperty = DependencyProperty.Register("Name", typeof(string), typeof(Student));

        public string Name
{
get { return (string)this.GetValue(Student.NameProperty); }
set { this.SetValue(Student.NameProperty, value); }
}
}
 Student stu;

        public MainWindow()
{
InitializeComponent();
stu = new Student();
Binding binding = new Binding("Text") { Source = textBox1 };
BindingOperations.SetBinding(stu, Student.NameProperty, binding);
// textBox2.SetBinding(TextBox.TextProperty, binding);
} private void Button_Click(object sender, RoutedEventArgs e)
{
MessageBox.Show(stu.Name); }

在MainWindow()中的最后两行代码,绑定Student实例和textbox,textbox作为数据源,而Student实例作为目标,目标的属性为NameProperty。

如此便实现了前台TextBox输入字符串和后台的Student实例的数据绑定。

WPF学习笔记——依赖属性(Dependency Property)的更多相关文章

  1. WPF学习笔记(一):数据绑定之元素到元素绑定

    前言 作为一只菜鸟,之前学了一段时间的WPF,但是没有总结,过了一学期发现好多东西都忘记了,很多东西还是需要记下来,以备后续复习. 数据绑定在事件中应用非常广泛,可以有效地减少代码量,那么什么是数据绑 ...

  2. WPF 学习笔记-设置属性使窗口不可改变大小

    原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...

  3. WPF中的依赖属性

    1. WPF中的依赖属性 依赖属性是专门基于WPF创建的.在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使用方法与普通的属性是相同的. 1.1 依赖属性提供的属性功能 资源 数据绑定 样式 ...

  4. WPF 学习笔记-在WPF下创建托盘图标

    原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...

  5. WPF学习笔记-用Expression Design制作矢量图然后导出为XAML

    WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...

  6. WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决

    原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...

  7. WPF 精修篇 依赖属性

    原文:WPF 精修篇 依赖属性 依赖属性使用场景 1. 希望可在样式中设置属性. 2. 希望属性支持数据绑定. 3. 希望可使用动态资源引用设置属性. 4. 希望从元素树中的父元素自动继承属性值. 5 ...

  8. WPF学习笔记二 依赖属性实现原理及性能分析

    在这里讨论依赖属性实现原理,目的只是学习WPF是怎么设计依赖属性的,同时更好的使用依赖属性. 首先我们来思考一个简单的问题:我们希望能验证属性的值是否有效,属性变更时进行自己的处理.回顾一下.net的 ...

  9. 【WPF学习笔记】之依赖属性

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

随机推荐

  1. CALayer 详解 -----转自李明杰

    本文目录 一.什么是CALayer 二.CALayer的简单使用 回到顶部 一.什么是CALayer * 在iOS系统中,你能看得见摸得着的东西基本上都是UIView,比如一个按钮.一个文本标签.一个 ...

  2. JAVA动手动脑

    1.运行 TestInherits.java 示例,观察输出,注意总结父类与子类之间构造方法的调用关系修改Parent构造方法的代码,显式调用GrandParent的另一个构造函数,注意这句调用代码是 ...

  3. JSTL跳出<c:forEach>循环

    <c:forEach items="${consultPager.dataList }" var="consult"> <tr> < ...

  4. JavaScript 变量作用域

    一. 变量声明 变量用var关键字来声明,如下所示: 变量在未声明的情况下被初始化,会被添加到全局环境. JavaScript执行代码时,会创建一个上下文执行环境,全局环境是最外围的环境.每个函数在被 ...

  5. iOS沙盒处理

    沙盒文件 每个ios应用都有自己的应用沙盒,应用沙盒就是文件系统目录,与其他应用的文件系统隔离,ios系统不允许访问其他应用的应用沙盒.在ios8中已经开放访问. 应用沙盒一般包括以下几个文件目录:应 ...

  6. CentOS6.6 kickstart文件

    # Kickstart file automatically generated by anaconda. #version=DEVELinstall#cdromurl --url http://19 ...

  7. SQL IF ELSE

    if (条件)    begin        (执行模块)    endelse if (条件)    begin        (执行模块)    endelse    begin        ...

  8. asp.net初识

    请求=========处理=============响应 不是服务器读网页.表单,而是我们向服务器提交数据 1.asp.net 服务器端控件是ASP.NET对HTML的封装,ASP.NET会将服务器端 ...

  9. wp8开发笔记之应用程序真机发布调试

    写在前面的话: 相信很多和我一样关注wp8动态以及已经开发了一些wp8应用程序的朋友们都遇到过这样的问题,写的程序在模拟器上进行调试总是显的没什么说服力,想拿真机进行实际测试, 该怎么办才好呢? 进行 ...

  10. linux密码的更改

    找到UTF-8,在后面空格后输入init=/bin/sh  然后CHRL+X启动 进入到这个界面,输入mount -o remount,rw / 再输入touch / .autorelabel ,然后 ...