WPF 依赖属性

本文介绍了WPF中的依赖属性,包括其作用、为什么需要数据绑定,以及如何自定义依赖属性。依赖属性支持数据绑定,允许在后台代码中修改界面控件的内容。文中通过示例详细解释了依赖属性的定义过程,包括值变化回调、验证回调和强制回调的使用。此外,还探讨了依赖附加属性,用于为不支持绑定的控件提供绑定功能,并给出了使用场景和定义方法。
摘要由CSDN通过智能技术生成

初学者。博客仅做个人的理解整理,不到位的地方欢迎大佬们指出,感谢。

1.什么是依赖属性,它的作用是什么

需要了解一下wpf中数据绑定的东西。

个人理解依赖属性就是为了支持数据绑定的功能, 只有依赖属性才支持绑定表达式,那为什么要绑定呢?绑定后可以实现在后台代码修改数据,对应的界面的控件内容也修改。

如:button的content,textbox的Text,textblock的text,这些属性都支持绑定,从代码中也可以看到(vs中 在属性上按F12)

button的Content属性

button的Content的依赖属性

 

 什么场合要自定义依赖属性?

如果我想创建一个userControl(或者其他的,暂时只用到了userControl),并且让它的某些属性也能绑定,这时候就要自己定义依赖属性。先看下依赖属性的语法,然后举个例子。

2.如何定义依赖属性

    3个步骤:声明 注册 包装

依赖属性也是属性,属于某个类或者控件。propdp按2此tab即可自动补全

public int MyValue
        {
            get { return (int)GetValue(MyvarProperty); }
            set { SetValue(MyvarProperty, value); }
        }

        // Using a DependencyProperty as the backing store for Myvar.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyvarProperty =
            DependencyProperty.Register("MyValue", typeof(int), typeof(UserControl1), new PropertyMetadata(10, MyValueChanged));

整理一下:

比如现在我定义一个usercontrol,包含一个textblock,在MainWindow中定义一个usercontrol,1个textblock一个button

点击MianWindow的button,MainWindow的textblock的text+1;用usercontrol 的依赖属性绑定MainWindow的textblock的text

usercontrol布局代码:

 <TextBlock x:Name="txt"/>

MianWindow布局代码:

 <StackPanel>
            <local:UserControl1 MyValue="{Binding Text,ElementName=tb}"/>
            <TextBlock Name="tb" Text="110"/>
            <Button Content="ok" Click="Button_Click"/>
        </StackPanel>

点击ok按钮,发现UserControl里面的Textblock的数据也变化了

 数据流向:点击ok按钮,MainWIndow中的TextBlock数据变化,UserControl的MyValue绑定了前一个Textblock的Text,所以UserControl中的依赖属性MyValue也变化,然后在回调函数中通知Usercontrol中的Textblock界面也变化。

 下图是自己的理解,仅供参考

 

3.依赖属性几个回调函数:值变化回调,验证回调,强制回调

注册依赖属性的Register函数有3个原型,值变化回调函数和强制回调是写在PropertyMetadata这个对象参数里面的

public PropertyMetadata(object defaultValue, PropertyChangedCallback propertyChangedCallback, CoerceValueCallback coerceValueCallback)
public static DependencyProperty Register(string name, Type propertyType, Type ownerType)
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata)
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata, ValidateValueCallback validateValueCallback)

值变化回调函数:当依赖属性的数据发生变化时执行

验证回调:当依赖属性的数据发生变化时,先进行验证,可以做一些限制,如果验证成功则执行值变化回调,修改新数据,如果验证不通过,则不执行值变化回调

强制回调:当依赖属性的数据发生变化时,进行判断,如果超出限制范围,则设置一个新数据,然后执行值变化回调。

强制回调和验证回调有什么区别?

验证回调如果不通过,则不会执行值变化回调,数据不会被修改

强制回调可以设置一个预期值,当超过范围时,把预期值通过值变化回调写入依赖属性(这一步再验证回调里也可以做)

触发顺序:先执行验证回调函数,再执行强制回调,最后是值变化回调

4.依赖附加属性

4.1依赖附加属性的作用:

额外定义一个属性,把这个属性提供给另一个控件使用。

4.2依赖属性和依赖附加属性的区别?

  A.都是需要注册声明包装,在注册和包装上有差别

 B.依赖属性的ownerclass必须时依赖对象(继承于DependencyObject),依赖附加属性的ownerclass可以不是依赖对象,但它要附加给哪个对象用,这个对象必须是依赖对象。

4.3依赖附加属性的定义(vs中propa 2次tab)

public static int GetMyProperty(DependencyObject obj)  //包装器用一个方法去封装,要附加给谁用,那这个目标对象必须是依赖对象,所以这里传递一个DepemdencyObiect
        {
            return (int)obj.GetValue(MyPropertyProperty);
        }

        public static void SetMyProperty(DependencyObject obj, int value)
        {
            obj.SetValue(MyPropertyProperty, value);
        }

        // Using a DependencyProperty as the backing store for MyProperty.  This enables animation, styling, binding, etc...
        public static readonly DependencyProperty MyPropertyProperty =
        DependencyProperty.RegisterAttached("MyProperty", typeof(int), typeof(ownerclass), new PropertyMetadata(0)); //用DependencyProperty.RegisterAttached注册依赖附加属性

4.4 依赖附加属性的值变化回调,验证回调,强制回调和依赖属性的用法一样

4.5 依赖附加属性的使用场景

如果一个控件的某个属性不支持绑定,但是我又想让他绑定,这时候就定义一个依赖附加属性,关联到这个对象上去。

passworBox的password是不支持绑定的,它只是一个普通属性,不是依赖属性,现在给passwordbox控件添加一个依赖附加属性,让它的password属性能实现绑定功能。

 passwordbox中的password不能绑定,新建一个依赖附加属性,依赖附加属性去绑定一个数据,在依赖附加属性的值变化回调函数里面去修改passwordbox的password普通属性,相当于一个中转。

依赖附加属性定义

 布局代码和绑定

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值