• WPF的依赖项属性


        WPF的依赖项属性

         属性与事件是.NET抽象模型的核心部分。WPF使用了更高级的依赖项属性(Dependency Property)功能来替换原来.NET的属性,实现了更高效率的保存机制,还添加了附加功能,如属性变更通知以及强制回调、属性值继承(在逻辑树中向下传播默认属性值的能力)以及属性有效性验证等。同时,依赖项属性也是WPF许多重要功能的基础,包括动画、数据绑定以及样式。

         依赖项属性的使用基础

          使用依赖项属性包括三个部分,定义依赖项属性;注册依赖项属性以及添加属性包装器。

         定义依赖项属性,使用三个修饰词,public、static、readonly。数据类型为DependecyProperty,而每一个依赖项属性都会有一个去掉“Property”的CLR属性和他对应,而我们在xaml中访问的都是CLR属性。

         注册依赖项属性,这也是依赖项属性的真正含义,在于定义一个DependecyProperty属性后外部访问只能通过其对应的CLR属性,其本质通过DependecyProperty.Register注册,写入了DependecyProperty类中的Hastable中,所有的依赖属性都写入这个哈希表中,哈希表的key值由依赖项属性的name+type组成,保证了key值的唯一性。当需要设置依赖项属性的值时,则会为这个对象创建一个数组,数据类型为EffectiveValueEntry,包含了一个属性的index,DependencyProperty提供了一个方法GetglobalIndex来获取此属性在Hashtable中的位置,value当然就可以在此取出。

           注册依赖项属性,在这一步骤中,我们主要负责提供5个要素:

    1.       属性名
    2.       属性使用的数据类型
    3.       拥有该属性的类型
    4.       一个具有附加属性设置的(Framework)PropertyMetadata对象,可选
    5.      一个用于验证属性的回调函数 ValidateValueCallback(验证回调),可选

           其中的FrameworkPropertyMetadata依赖属性元数据对象,是功能最为丰富的一项要素,元数据中可能包括WPF不同级别的依赖属性的特征,这些特征报告各种服务(如 WPF框架级别的布局引擎和属性继承逻辑)的信息和状态,大致包括以下信息:

    •      依赖项属性的默认值
    •      更改通知的回调实现的引用
    •      强制回调实现的引用
    public static DependencyProperty Register(
        string name,--依赖项对象的名称
        Type propertyType,--属性的类型
        Type ownerType,--依赖项对象的所有者类型
        PropertyMetadata typeMetadata,--依赖项对象的属性元数据
        ValidateValueCallback validateValueCallback--对回调的引用
    )
    
    public PropertyMetadata(
        Object defaultValue,--依赖项对象的默认值
        --每当属性的有效值更改时,属性系统都将调用该处理程序实现
        PropertyChangedCallback propertyChangedCallback,
        --每当属性系统对该属性调用 CoerceValue 时都将调用此处理程序实现
        CoerceValueCallback coerceValueCallback
    )
    --核心级别具有呈现/用户界面影响的非框架属性提供属性元数据
    public UIPropertyMetadata(
        Object defaultValue,
        PropertyChangedCallback propertyChangedCallback,
        CoerceValueCallback coerceValueCallback,
        bool isAnimationProhibited--是否禁止动画处理,默认为false
    )
    --框架的属性系统
    public FrameworkPropertyMetadata(
        Object defaultValue,
        --元数据选项标志(FrameworkPropertyMetadataOptions 值的组合)
        FrameworkPropertyMetadataOptions flags,
        PropertyChangedCallback propertyChangedCallback,
        CoerceValueCallback coerceValueCallback,
        bool isAnimationProhibited,
        --此属性的绑定时使用的 UpdateSourceTrigger
        UpdateSourceTrigger defaultUpdateSourceTrigger
    )

          依赖项属性值变更回调、强制回调以及验证回调的执行顺序如下:

          验证:ValidateValueCallback

          强制值:CoerceValueCallback

          回调:PropertyChangedCallback

         添加属性包装器,最后一个步骤是使用传统的.NET属性封装WPF的依赖项属性,封装函数中set、get访问器分别调用了DependecyObjec基类中定义的GetValue()和SetValue()方法。

          依赖项属性在数据绑定中的应用

            

     

     

             数据绑定中,有5个要素:

    1.    Source:确定哪个对象作为数据源
    2.    Target:确定哪个对象作为目标
    3.    声明一个Binding实例,用于关联数据
    4.    数据源的Path,可以是CLR属性也可以是依赖项属性,甚至属性的子属性
    5.    目标的D.P.,只能是依赖项属性

         D.P.的全称是“Dependency Property”,直译过来就是“依赖式属性”,意思是说它自己本身是没有值的,它的值是“依赖”在其它对象的属性值上、通过Binding的传递和转换而得来的。表现在例子里,它就是Target上的被数据所驱动的联动属性了!

         其中值得注意的是,当源数据发生改变时,需要通知界面数据变更,并进行界面更新。如若,数据源的Path是一个普通属性,即需要实现INotifyPropertyChanged接口,以此来通知界面变更;而如果数据源的Path是一个依赖项属性,其中INotifyPropertyChanged是为DependencyObject服务的,即可自动发生界面更新事件。

         在数据绑定中,也凸显了Winform与WPF的巨大差异,WPF真正意义上实现了 “数据驱动界面” 的模式。换而言之,数据是底层、是心脏,数据变了作为表层的UI就会跟着变、将数据展现给用户;如果用户修改了UI元素上的值,相当于透过UI元素直接修改了底层的数据;数据处于核心地位,UI处于从属地位。数据是程序的发动机(驱动者)、UI成了几乎不包含任何逻辑专供用户观察数据和修改数据的“窗口”(被驱动者)。

  • 相关阅读:
    Pytest训练营总结,内附考试题及答案
    环境问题还是测试的老大难?两个步骤轻松搞定
    测试必会 Docker 实战(一):掌握高频命令,夯实内功基础
    利器 | TestNG 与 Junit 对比,测试框架如何选择?
    技术分享 | 这些常用测试平台,你们公司在用的是哪些呢?
    干货|app自动化测试之模拟器控制
    技术分享 | 测试人员必须掌握的测试用例
    大话JMeter4|不同的并发数可以自动化做压测吗?
    战胜测试内卷转型测试开发,拿名企offer最多的班型是如何设计的?
    2022 云原生编程挑战赛启动!导师解析服务网格赛题
  • 原文地址:https://www.cnblogs.com/dzw2017/p/6895807.html
Copyright © 2020-2023  润新知