WPF学习笔记——依赖属性(Dependency Property)
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)的更多相关文章
- WPF学习笔记(一):数据绑定之元素到元素绑定
前言 作为一只菜鸟,之前学了一段时间的WPF,但是没有总结,过了一学期发现好多东西都忘记了,很多东西还是需要记下来,以备后续复习. 数据绑定在事件中应用非常广泛,可以有效地减少代码量,那么什么是数据绑 ...
- WPF 学习笔记-设置属性使窗口不可改变大小
原文:WPF 学习笔记-设置属性使窗口不可改变大小 调整Windows下的ResizeMode属性: ResizeMode = NoResize Resize属性是控制Windows是否可以改变大小, ...
- WPF中的依赖属性
1. WPF中的依赖属性 依赖属性是专门基于WPF创建的.在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使用方法与普通的属性是相同的. 1.1 依赖属性提供的属性功能 资源 数据绑定 样式 ...
- WPF 学习笔记-在WPF下创建托盘图标
原文:WPF 学习笔记-在WPF下创建托盘图标 首先需要在项目中引用System.Windows.Forms,System.Drawing; using System; using System.Co ...
- WPF学习笔记-用Expression Design制作矢量图然后导出为XAML
WPF学习笔记-用Expression Design制作矢量图然后导出为XAML 第一次用Windows live writer写东西,感觉不错,哈哈~~ 1.在白纸上完全凭感觉,想象来画图难度很大, ...
- WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决
原文:WPF学习笔记(8):DataGrid单元格数字为空时避免验证问题的解决 如下图,在凭证编辑窗体中,有的单元格不需要数字,但如果录入数字后再删除,会触发数字验证,单元格显示红色框线,导致不能执行 ...
- WPF 精修篇 依赖属性
原文:WPF 精修篇 依赖属性 依赖属性使用场景 1. 希望可在样式中设置属性. 2. 希望属性支持数据绑定. 3. 希望可使用动态资源引用设置属性. 4. 希望从元素树中的父元素自动继承属性值. 5 ...
- WPF学习笔记二 依赖属性实现原理及性能分析
在这里讨论依赖属性实现原理,目的只是学习WPF是怎么设计依赖属性的,同时更好的使用依赖属性. 首先我们来思考一个简单的问题:我们希望能验证属性的值是否有效,属性变更时进行自己的处理.回顾一下.net的 ...
- 【WPF学习笔记】之依赖属性
概述: Windows Presentation Foundation (WPF) 提供了一组服务,这些服务可用于扩展公共语言运行时 (CLR) 属性的功能.这些服务通常统称为 WPF 属性系统.由 ...
随机推荐
- DevExpress--navBarControl控件
一.在工具箱Navigation&Layout下找到控件navBarControl,拽到相应的位置. 二.点击控件右上角的小三角,对其进行设计:如下图 点Add group可迅速添加组列表,点 ...
- C#数据库导出(入)TXT
导出: public void ExportTxt() { var file = System.IO.File.Open(path, System.IO.FileMode.Open); using ( ...
- 【转】Linux Top 命令解析 比较详细
TOP命令是Linux下常用的性能分析工具,能够实时显示系统中各个进程的资源占用状况. TOP是一个动态显示过程,即可以通过用户按键来不断刷新当前状态.如果在前台执行该命令,它将独占前台,直到用户 ...
- Error Domain=ASIHTTPRequestErrorDomain Code=8 "Failed to move file from"xxx/xxx"to"xxx/xxx"
今天真的好高兴呀 我解决了一个折磨了我一周的问题,真的是激动地要哭出来了,为了这个问题,我嘴也烂了,头发抓了一地啊.虽然解决方法,最后还是展现出了“百度”的伟大,但是我还是很开心,在这里我展示一下我的 ...
- python 异常处理学习笔记
搬运至慕课网,精华截图,视频链接在这 : http://www.imooc.com/learn/457 1. 异常检查目的 2. python 可能出现的异常 3. 异常的处理过程 try - ex ...
- hibernate中validate的使用(转)
原文链接:http://blog.csdn.net/xing_sky/article/details/8484551 首先是要加入下面两个包 hibernate-validator-4.1.0.Fin ...
- WebService 生成类的命令语句
在开发项目中,有时候需要调用webservice接口程序,根据项目规定有的项目是直接引入接口,有的是需要把接口生成代理类的形式在项目中使用,根据项目需要来取舍. 以下列出项目中常用的Webservic ...
- 关于aggregation 语法和表达式大全(最新3.4版)
用mongodb四年多了,从1.8版用到目前的3.4版,功能越来越强大,而且它的每一次升级带给我的都是惊喜,最近发现他的aggregation(管道)技术越来越丰富了,基本上将它提供的所有功能都集成了 ...
- 对象序列化到本地文件 ObjectOutputstream ObjcetInputstream
package com.main.test; import java.io.FileInputStream; import java.io.FileNotFoundException; import ...
- Alpha版使用说明书
游戏规则: 玩家是黑色的小煤球哦! 通过方向键或者ASDW,来控制小球移动(上.下.左.右). 累计时间,直到碰到了红色的小球 ...