• 依赖属性 附加属性通俗理解


    依赖属性以及附加属性

    依赖属性(DependencyProperty

    1.概念

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

    依赖属性是为了解决普通属性因继承而带来的对象膨胀。

    例如Button的继承

    Button->ButtonBase->ContentControl->Control->FrameworkElement->UIElement->Visual->DependencyObject->...

    所以每次继承,父类的私有字段都会被继承下来。继承树的低端对象不可避免的膨胀。大多数属性并没有被修改,仍然保持着父类定义时的默认值。

    定义依赖属性

      例:

                  // 定义依赖属性

                public static readonly DependencyProperty NameProperty;

    注册依赖属性

     必须在于其关联的静态构造函数中注册

    添加属性封装器

               public string Title

                {

                    get { return (string)GetValue(NameProperty); }

                    set { SetValue(NameProperty, value); }

             }

    创建属性封装器时,应当只包含对SetValue()和GetValue()方法的调用,不应当添加任何验证属性值的额外代码、引发事件的代码等。这是因为WPF中的其他功能可能会忽略属性封装器,并直接调用SetValue()和GetValue()方法。

    属性封装器不是验证数据或引发事件的正确位置,使用依赖属性回调函数(Dependency-Property.Validate ValueCallback回调函数进行验证操作)

    当属性变化时,如果希望进行响应,有两种选择--可以使用属性值创建绑定,也可以编写能够自动改变其他属性或开始动画的触发器。

    依赖属性的优点:

    ① 优化了属性的存储,减少了不必要的内存使用

    ② 加入了属性变化通知,限制,验证等

    ③ 可以存储多个值,配合人EXpression以及Animation等,打造出更灵活的使用方式

    eg:

     1 public partial class MainWindow : Window
     2     {
     3         public MainWindow()
     4         {
     5             InitializeComponent();
     6             TestTitle testTitle = new TestTitle { Title = "TestData" };
     7             this.stkpnlTest.DataContext = testTitle;
     8         }
     9 
    10         public class TestTitle : DependencyObject
    11         {
    12             public string Title
    13             {
    14                 get { return (string)GetValue(NameProperty); }
    15                 set { SetValue(NameProperty, value); }
    16             }
    17             // 定义依赖属性
    18             public static readonly DependencyProperty NameProperty =
    19                 DependencyProperty.Register("Title", typeof(string), typeof(TestTitle));
    20         }
    21     }

    xaml:

    1  <StackPanel x:Name="stkpnlTest">
    2         <TextBox x:Name="txtTest1"
    3                  Margin="10"
    4                  Text="{Binding Path=Title}"></TextBox>
    5         <TextBox x:Name="txtTest2"
    6                  Margin="10"
    7                  Text="{Binding Path=Title}"></TextBox>
    8     </StackPanel>

    附加属性

    1.概念

    附加属性是一种依赖属性,不同之处在于附加属性被应用到的类并非定义附加属性的那个类。

    定义附加属性

    定义附加属性,需要使用RegisterAttached()方法,而不是使用Register()方法

    当创建附加属性时,不必定义.NET属性封装器。这是因为附加属性可以被用于任何对象。例如,GridRow属性可能被用于Grid对象,也可能被用于其他元素上。

    不使用.NET属性封装器,反而附加属性需要调用两个静态方法来设置和获取属性值,这两个方法使用为人熟知的SetValue()GetValue()方法,这两个方法应当命名为SetPropertyName()和GetPropertyName()。

    附加属性与依赖属性的区别

    1.附加属性使用的RegisterAttached方法,而依赖属性使用的是Register方法

    2.附加属性使用两个方法进行包装,依赖属性使用CLR属性对GetValue和Set Value两个方法进行包装。

    3.附加属性被应用到的类并非定义附加属性的那个类,依赖属性被应用到定义附加属性的那个类。

  • 相关阅读:
    wsl中的git问题
    接口测试框架实战(三)| JSON 请求与响应断言
    接口测试框架实战(二)| 接口请求断言
    面试大厂测试开发之前,你需要做好哪些准备?
    接口测试框架实战(一) | Requests 与接口请求构造
    实战 | UI 自动化测试框架设计与 PageObject 改造
    用 Pytest+Allure 生成漂亮的 HTML 图形化测试报告
    外包测试的职业发展利弊分析与建议
    做软件测试,到底能不能去外包?
    移动自动化测试入门,你必须了解的背景知识和工具特性
  • 原文地址:https://www.cnblogs.com/wjrelax/p/9958224.html
Copyright © 2020-2023  润新知