zoukankan      html  css  js  c++  java
  • 说说WPF的依赖属性

    首先,我们先来大概了解一下依赖属性

    什么是依赖属性:依赖属性自己没有值,通过依赖别人(如Binding)来获得值。

    依赖属性为什么会出现:控件常用字段有限,包装太多属性会占用过高内存,造成浪费。所以用依赖属性,用不着就不用,用得着就用。

    怎么声明依赖属性:用public static readonly三个修饰符修饰。

    怎么声明实例:使用DependencyProperty.Register方法生成。此方法有三个参数跟四个参数。

    怎么操作依赖属性的值:利用依赖对象(Dependency Object)的GetValue、SetValue方法实现。

    现在,我们用代码来实现一下依赖属性:

    XAML

    <Window x:Class="DependecyProperty.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:DependecyProperty"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <TextBox />
            <TextBox x:Name="testTB"/>
        </StackPanel>
    </Window>
    

      声明依赖属性与引用

      public class Student : DependencyObject
        {
    
            /// <summary>
            /// 声明依赖属性
            /// </summary>
            // Using a DependencyProperty as the backing store for NameProperty.  This enables animation, styling, binding, etc...
            public static readonly DependencyProperty NamePropertyProperty =
                DependencyProperty.Register("NameProperty", typeof(string), typeof(Student));
    
        }
    引用

    public MainWindow()
    {
    InitializeComponent();
    //实例化类
    Student stu = new Student();
    //给依赖属性赋值
    stu.SetValue(Student.NamePropertyProperty,"dfsdfsd");
    //获取依赖属性的值
    testTB.Text = stu.GetValue(Student.NamePropertyProperty).ToString();
    }

    运行程序则成功获取依赖属性的值。但不能直接在xaml中得到依赖属性的值?我们可以绑定依赖属性到文本框上

    <Window x:Class="DependecyProperty.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:DependecyProperty"
            mc:Ignorable="d"
            Title="MainWindow" Height="350" Width="525">
        <StackPanel>
            <TextBox />
            <!--当依赖属性改变时,文本框的字符也得到通知,实时改变 -->
            <TextBox x:Name="testTB" Text="{Binding NameProperty,Mode=TwoWay}"/>
        </StackPanel>
    </Window>
    

      在后置代码处绑定数据

     //实例化类
                Student stu = new Student();
                this.DataContext = stu;
    

      则成功获取依赖属性

    可能到此处就有人问了,声明依赖属性打这么多字很麻烦,有没有方便的方法?可以通过打propdp然后按两次tab键,visual studio会自动生成依赖属性,自动生成的依赖属性的DependencyProperty.Register

     (可能有观察力强的人问,新增依赖属性会产生这么多错误吗?因为途中有多个错误信息。其实这些错误是我在命名空间中声明依赖属性导致的,这是个错误的示范,无视即可)

    依赖属性应用于什么场景?

    依赖属性可用于场景不断变化的场景,比如一个按钮的文字在不同情况下变化。这种情况我们可以继承接口INotifyPropertyChanged,然后声明属性的变化通知。不过相对依赖属性来说,它的性能成本高,所以这样的情况就可以使用依赖属性。其它类需要使用此依赖属性的时候 ,也可以借用。一般依赖属性的应用场景是自定义控件。

      

  • 相关阅读:
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 字符串逆序
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 最长字符串
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Java实现 蓝桥杯VIP 算法训练 成绩的等级输出
    Qt 自定义model实现文件系统的文件名排序
  • 原文地址:https://www.cnblogs.com/ssvip/p/9184199.html
Copyright © 2011-2022 走看看