依赖属性和附加属性

依赖属性:一种可以自己没值,并能通过使用Binding从数据源获得值(依赖在别人身上)的属性。

我们做个小例子:将第二个文本框的值依赖到第一个文本框上,即第一个输什么,第二个就显示什么。

先写个简单的XAML页面: 

<Window x:Class="MyDependencyProperty.Window1"
        xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
        xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
        Title="Window1" Height="150" Width="200">
    <StackPanel>
        <TextBox x:Name="textBox1" BorderBrush="Black" Margin="5"/>
        <TextBox x:Name="textBox2" BorderBrush="Black" Margin="5"/>
    </StackPanel>
</Window>
  • 然后我们需要写依赖属性,依赖属性永远是用这三个修饰词:public static readonly。
  • 它的声明和实例化,使用DependencyProperty.Register方法产生。
  • 为了使用方便,我们会对依赖属性进行CLR包装。这样,在使用依赖属性的时候,就跟使用一般的CLR属性一样了。
  • SetBinding包装是为了让Person类能够使用绑定方法绑定界面的textBox1的值。

 实现一个有依赖属性的类:

public class Person : DependencyObject
    {
        /// <summary>
        /// CLR属性包装器
        /// </summary>
        public string Name
        {
            get { return (string)GetValue(NameProperty); }
            set { SetValue(NameProperty, value); }
        }

        /// <summary>
        /// 依赖属性
        /// </summary>
        public static readonly DependencyProperty NameProperty =
            DependencyProperty.Register("Name", typeof(string), typeof(Person));

        /// <summary>
        /// SetBinding包装
        /// </summary>
        /// <param name="dp"></param>
        /// <param name="binding"></param>
        /// <returns></returns>
        public BindingExpressionBase SetBinding(DependencyProperty dp, Binding binding)
        {
            return BindingOperations.SetBinding(this, dp, binding);
        }
    }

然后我们使用Binding把Person的对象per关联到textBox1上,在把textBox2关联到Person对象per上,形成Binding链。

依赖属性使用代码如下:

public Window1()
        {
            InitializeComponent();
            Person per = new Person();
            per.SetBinding(Person.NameProperty, new Binding("Text") { Source = textBox1 });
            textBox2.SetBinding(TextBox.TextProperty, new Binding("Name") { Source = per });
        }

运行效果:

附加属性:是指一个属性,本来不属于某个对象,但由于某种需求而被后来附加上,也就是放到特定环境里才具有的属性。

比如,人有很多属性,当人在学校里时,会有年级这个属性,这属性不必要一直有,是在学校里而给附加上的

Human类:

class Human : DependencyObject
    {
    }

再来个School类:

class School : DependencyObject
    {
        public static int GetGrade(DependencyObject obj)
        {
            return (int)obj.GetValue(GradeProperty);
        }

        public static void SetGrade(DependencyObject obj, int value)
        {
            obj.SetValue(GradeProperty, value);
        }

        // Using a DependencyProperty as the backing store for Grade.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty GradeProperty =
            DependencyProperty.RegisterAttached("Grade", typeof(int), typeof(School), new UIPropertyMetadata(0));

    }

我们可以看出来:

  • GradeProperty就是DependencyProperty类型成员变量。
  • 声明时同样使用public static readonly这三个修饰词。
  • 不同的是注册附加属性使用的方法是:RegisterAttached(),但参数却与Register无异。
  • 还有不同,包装器不同:依赖属性使用CLR属性对GetValue和SetValue两个方法进行包装;附加属性则使用public static void修饰的两个自命名方法包装。

使用附加属性,如在界面点击Grade的按钮是触发:

private void btn_Grade_Click(object sender, RoutedEventArgs e)
        {
            Human human = new Human();
            School.SetGrade(human, 6);
            int grade = School.GetGrade(human);
            MessageBox.Show(grade.ToString());
        }

它的前台界面:

<Grid>
        <Button Content="Grade" Width="120" Height="25" x:Name="btn_Grade" Click="btn_Grade_Click" />
    </Grid>

运行为:

时间: 2024-11-05 18:27:37

依赖属性和附加属性的相关文章

WPF学习(三) - 依赖属性和附加属性

学习WPF时,我在看一本叫做“深入浅出WPF”的书.整整20页都在讲依赖性性和附加属性,反复看了几遍居然还是不懂,真是郁闷. 上一篇中WPF绑定的例子,其实已经用到了依赖属性. // 作为被绑定的目标类,必须从DependencyObject派生 // 这样定义的类才能满足SetBinding方法的第一个参数的类型要求 // 还要额外定义一个依赖属性,用来满足SetBinding方法的第二个参数要求 // 用DependencyObject派生方法GetValue和SetValue,控制属性的存

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

转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最重要的知识点——依赖属性. 二.依赖属性的全面解析 听到依赖属性,自然联想到C#中属性的概念.C#中属性是抽象模型的核心部分,而依赖属性是专门基于WPF创建的.在WPF库实现中,

UWP深入学习三:依赖属性、附加属性和数据绑定

Dependency properties overview Custom dependency properties Attached properties overview Custom attached properties Quickstart: Data binding to controls Data binding overview (XAML) 使用代码创建绑定 你还可以使用规程代码而不是 XAML 来将 UI 元素连接到数据.若要执行此操作,先创建新 Binding 对象,设置

背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性

原文:背水一战 Windows 10 (78) - 自定义控件: 基础知识, 依赖属性, 附加属性 [源码下载] 作者:webabcd 介绍背水一战 Windows 10 之 控件(自定义控件) 自定义控件的基础知识,依赖属性和附加属性 示例演示自定义控件的基础知识,依赖属性和附加属性1.自定义控件的示例/MyControls/themes/generic.xaml <ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/

WPF基础到企业应用系列7——深入剖析依赖属性(WPF/Silverlight核心)

一. 摘要 首先圣殿骑士非常高兴这个系列能得到大家的关注和支持.这个系列从七月份開始到如今才第七篇,上一篇公布是在8月2日,掐指一算有二十多天没有继续更新了,最主要原因一来是想把它写好,二来是由于近期几个月在筹备"云计算之旅"系列,所以一再推迟了公布进度. 之前一直都没有想过要录制视频.基本的原因还是怕自己知识有限,从而误导他人,所曾经几次浪曦和51CTO邀请录制视频,我都以工作忙.公司内部培训须要时间和自己有待提高等理由委婉的拒绝了,说实在的.自己也知道自己还有非常多地方有待提高.还

Dependency Property 依赖属性

WPF开发中,必须使用依赖对象作为依赖属性的宿主,使二者结合起来.依赖对象的概念被DependencyObject类所实现,依赖属性的概念则由DependencyProperty类所实现 从这棵继承树上可以看出,WPF的所有UI空间都是依赖对象. 看最简单的依赖属性 class Student : DependencyObject { public string Name { get { return (string)GetValue(NameProperty); } //依赖属性和附加属性定义

WPF 依赖属性概念

理解依赖属性 在 WPF 中变成相比较于 传统 Windows Forms 变成发生了较大的改变. 属性现在以一组服务的形式提供给开发人员. 这组服务就叫做属性系统. 由 WPF 属性系统所支持的属性成为依赖属性. 依赖属性的概念 WPF 在依赖属性中提供了标准属性无法提供的功能, 特性如下: 决定属性值: 依赖属性的属性值可以在运行时有其他元素或者是其他信息所决定, 决定的过程具有一个优先次序. 自动验证或变更通知: 依赖属性哟一个自定的回调方法, 当属性值变更时被执行, 这个回调能验证新的值

WPF快速入门系列(2)——深入解析依赖属性

一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最重要的知识点——依赖属性. 二.依赖属性的全面解析 听到依赖属性,自然联想到C#中属性的概念.C#中属性是抽象模型的核心部分,而依赖属性是专门基于WPF创建的.在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性,但我们必须明确,在WPF中我们大多数

WPF依赖属性1

属性是.net的核心部分,是每个.net程序员都必须熟悉的特性,但是在wpf中引入了依赖属性的概念,依赖属性和原来属性的定义完全不一样,wpf通过依赖属性改变了元素属性的定义方式,依赖属性为wpf的数据绑定.动画以及样式,都起到了关键的作用,所以理解依赖属性,对于理解wpf至关重要. C#的普通属性的定义,我们十分熟悉,他是一个成员变量,增加了get/set 方法实现的一种访问器,基本定义如下: class Example {     private string name;     publi