依赖属性

概念

依赖属性就是自己自己没有值,通过Binding从数据源获得值,就是依赖在别人身上,拥有依赖属性的对象称为依赖对象

应用依赖属性的场景

1、在样式中设置属性。
2、属性支持数据绑定。
3、使用动态资源引用设置属性。
4、从元素树中的父元素自动继承属性值。
5、属性可进行动画处理。
6、属性系统在属性系统、环境或用户执行的操作或者读取并使用样式更改了属性以前的值时报告。
7、使用已建立的、WPF 进程也使用的元数据约定,
例如报告更改属性值时是否要求布局系统重新编写元素的可视化对象。依赖对象创建时并不包含存储数据空间。WPF中必须使用依赖对象作为依赖属性的宿主。

用于数据绑定

依赖属性是针对一个类的静态属性
每个类实例去这个静态属性里面Get属于自己的那一个属性

对象有属性,属性的值去公共数据区域【所有类实例的依赖属性都放在一个静态变量(公共区域)里面】里面取
优势:公共数据区域不在UI线程,所以可以随时修改数值

Tips

WPF界面元素为依赖对象,所有属性为依赖属性,所以支持绑定

1

示例

自定义控件

public class CustomBorder : Border
{
    public CustomBorder()
    {
        //初始化时默认给定一个背景色 
        Background = Brushes.Blue;
    }
    

    //属性
    public Double Transparency
    {
        get { return (Double)GetValue(TransparencyDependency); }
        set { SetValue(TransparencyDependency, value); }
    }

    //注册依赖属性
    public readonly static DependencyProperty TransparencyDependency =
        DependencyProperty.Register( 
        //属性名
        "Transparency",
        //属性数据类型
        typeof(Double),
        //拥有者
        typeof(CustomBorder),
        //处理方法
        new PropertyMetadata(new PropertyChangedCallback(transparencyPropertyChangedCallback))
        );

    //当属性修改时的处理
    static void transparencyPropertyChangedCallback(DependencyObject sender, DependencyPropertyChangedEventArgs e)
    {
        CustomBorder border = (sender as CustomBorder);
        if (border != null)
        {
            border.Opacity = 1 - Convert.ToDouble(e.NewValue) / 255;
        }
    }
}

DependencyProperty的Register方法

有几种重载方法,下面展示两种

5

//
// 摘要:
//     使用指定的属性名称、属性类型、所有者类型和属性元数据注册依赖属性。
//
// 参数:
//   name:
//     要注册的依赖属性的名称。
//
//   propertyType:
//     属性的类型。
//
//   ownerType:
//     正在注册依赖属性的所有者类型。
//
//   typeMetadata:
//     依赖属性的属性元数据。
//
// 返回结果:
//     一个依赖属性标识符,应使用它来设置类中 public static readonly 字段的值。 稍后将此标识符用来引用依赖属性,从而实现以编程方式设置其值或获取元数据等操作。
public static DependencyProperty Register(string name, Type propertyType, Type ownerType, PropertyMetadata typeMetadata);

前台

<Grid>
    <local:CustomBorder x:Name="bord" Transparency="{Binding ElementName=slider1, Path=Value}"></local:CustomBorder>
    <Slider Grid.Row="1" HorizontalAlignment="Left" Name="slider1" Width="130" Value="0" Minimum="0" Maximum="255" />
</Grid>

示例代码

https://github.com/zLulus/NotePractice/tree/dev3/WPF/WpfDemo/DependencyProperties

©著作权归作者所有,转载或内容合作请联系作者
平台声明:文章内容(如有图片或视频亦包括在内)由作者上传并发布,文章内容仅代表作者本人观点,简书系信息发布平台,仅提供信息存储服务。

推荐阅读更多精彩内容

  • Spring Cloud为开发人员提供了快速构建分布式系统中一些常见模式的工具(例如配置管理,服务发现,断路器,智...
    卡卡罗2017阅读 134,868评论 18 139
  • 问答题47 /72 常见浏览器兼容性问题与解决方案? 参考答案 (1)浏览器兼容问题一:不同浏览器的标签默认的外补...
    _Yfling阅读 13,790评论 1 92
  • 最近网上流传广泛的学生殴打教师或者教师殴打学生之类的视频。不管教师处于殴打或者被殴打,都要道歉~~或许你要说教师有...
    一个人私奔嗯阅读 256评论 0 0
  • 一切行业,终将成为金融业的一员! 当科学家千辛万苦到达的时候,佛学大师早已在此等候多时! ...
    洋槐花阅读 751评论 0 0
  • 520那一天 我拔下了那颗牙 口里至今留着麻药的味道 随时想吐 我看着那颗曾在我嘴里 高傲的牙齿 一动不动 它曾象...
    乔预阅读 160评论 0 0