WPF中依赖属性的值是是可以设置为可继承(Inherits)的,这种模式下,父节点的依赖属性会将其值传递给子节点。例如,数据绑定中经常使用的DataContextProperty:

var host = new ContentControl();
    var button = new Button();
    host.Content = button;

host.DataContext = Guid.NewGuid();
    Contract.Assert(object.Equals(host.DataContext, button.DataContext));

可以看到,虽然没有显示给button的DataContext赋值,但其自然沿袭的父节点的值。

这个特性很大程度上省去了我们的不少代码,那么如何使用自定义的依赖属性也具有这一特性呢,网上找到的例子一般如下:

class Host : ContentControl
    {
        public object Value
        {
            get { return (object)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(Host), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));
    }

class MyButton : Button
    {
        public object Value
        {
            get { return (object)GetValue(ValueProperty); }
            set { SetValue(ValueProperty, value); }
        }

public static readonly DependencyProperty ValueProperty = Host.ValueProperty.AddOwner(typeof(MyButton), new FrameworkPropertyMetadata(null, FrameworkPropertyMetadataOptions.Inherits));

}

可以看到,使能依赖属性的基础大体上要如下几步:

  1. 使用FrameworkPropertyMetadataOptions.Inherits使用标记源属性
  2. 使用DependencyProperty.AddOwner注册衍生属性,注册时需要FrameworkPropertyMetadataOptions.Inherits加上标记。

测试用例如下:

var host = new Host();
    var button = new MyButton();

host.Content = button;
    host.SetValue(Host.ValueProperty, Guid.NewGuid());
    Contract.Assert(object.Equals(host.GetValue(Host.ValueProperty), button.GetValue(MyButton.ValueProperty)));

这种方式虽然没有什么问题,但Host.ValueProperty.AddOwner(typeof(MyButton)这一截看起来非常别扭,研究了一下,实际上没有这么严格的父子关系,这样写也是可以的:

class DependcyPropertyHelper
    {
        public static DependencyProperty RegistInherits<TOwner>(DependencyProperty property)
        {
            return property.AddOwner(typeof(TOwner), new FrameworkPropertyMetadata(property.DefaultMetadata.DefaultValue, FrameworkPropertyMetadataOptions.Inherits));
        }
    }

class DependencyData : DependencyObject
    {
        public static readonly DependencyProperty ValueProperty =
            DependencyProperty.Register("Value", typeof(object), typeof(DependencyData));
    }

class Host : ContentControl
    {
        public static readonly DependencyProperty ValueProperty = DependcyPropertyHelper.RegistInherits<Host>(DependencyData.ValueProperty);
    }

class MyButton : Button
    {
        public static readonly DependencyProperty ValueProperty = DependcyPropertyHelper.RegistInherits<MyButton>(DependencyData.ValueProperty);
    }

这样写看起来就舒服一些了。细心的朋友看下就能发现:源属性DependencyData.ValueProperty都没有标记为可继承的(第一种方式下非要标记为可继承的),找了一下,也没有发现官方的详细文档的说明这个规则到底是什么样的,有空发现后再补充。

WPF 中依赖属性的继承(Inherits)相关推荐

  1. javascript中依赖属性(Dependency Property)的实现

    好久没在首页发点东西了,昨天在js上依照wpf中依赖属性的思想尝试写了基本的功能.这里拿出来与大家分享 Demo1 注册依赖属性 step1 定义一个函数 function Person() {thi ...

  2. WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性

    原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...

  3. WPF的依赖属性和附加属性(用法解释较全)

    转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...

  4. 面试总结(CSS 的盒模型?、CSS 中选择器的优先级以及 CSS 权重如何计算?、CSS 中哪些属性可继承,哪些不可以?、CSS 单位中 px、em 和 rem 的区别?、rem 适配....)

    CSS 的盒模型?         盒子模型(Box Modle)可以用来对元素进行布局,包括内边距,边框,外边距,和实际 内容这几个部分                 第一种是 W3C 标准的盒子 ...

  5. WPF之依赖属性和附加属性

     参考资料: 一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二         依赖属性之我见: 这两篇文章介绍的 ...

  6. CSS 中哪些属性可以继承?

    每个CSS属性定义的概述都指出了这个属性是默认继承的,还是默认不继承的.这决定了当你没有为元素的属性指定值时该如何计算 值. 当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值.只有文档根元 ...

  7. WPF快速入门系列(2)——深入解析依赖属性

    一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...

  8. 初步了解WPF依赖属性

    一 依赖属性 在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性.但必须明确,在WPF中我们大多数都在使用依赖属性,而不是使用属性.依赖属性重要性在 ...

  9. WPF整理-为User Control添加依赖属性

    WPF整理-为User Control添加依赖属性 原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more t ...

最新文章

  1. 设置RGBColor
  2. 【 MATLAB 】使用 impz 函数计算并画出脉冲响应
  3. Mysql 查询一天中每半小时记录的数量
  4. python pkl是什么类型的文件?怎么来打开它?(使用numpy和pickle都能打开)
  5. 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.2 选购镜头时应注意的事项...
  6. 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
  7. django-命名空间与反向解析-模板反向解析-视图反向解析
  8. ResourceExhaustedError 解决方案
  9. 程序员面试金典——11.3元素查找
  10. 《Unity虚拟现实开发实战》——第1章,第1.1节虚拟现实对你来说意味着什么
  11. [ZZ]为什么传统的自动化测试工具会扼杀敏捷?
  12. graphpad多条不同的曲线_GraphPad绘制几种常见散点图教程
  13. matlab帧差法图像识别
  14. 金盾播放器android安卓,(金盾高级视频加密系统跨平台播放器Android安卓安装步骤.doc...
  15. cad卸载不干净_BarTender卸载卸不干净的解决技巧
  16. 2022-2027年中国家用清洁产品行业发展监测及投资战略研究报告
  17. 经典基础教程---Programming TCP/IP Windows Sockets in C++
  18. 10 Kafka集群与运维
  19. 免费送5000多G之java,javaweb,python,大数据,区块链,安卓等的学习资源
  20. 微机原理知识点总结9(8255A+8251A)

热门文章

  1. 苹果6重置系统后无服务器,iphone6总是无服务,恢复初始设置就好了,然后一两天又不行了,怎么处理...
  2. 关于项目404解决方法:前提条件:项目路径都是正确的
  3. 为什么华为a1路由器网速变慢_路由器需要每天都关吗?看完专家的解释恍然大悟...
  4. 因分辨率变化html页面布局跳动_Web前端页面设计流程及注意事项,谨记!
  5. java 中button和jbutton输出的按钮不一样_Java学习教程(基础)--Java开发环境搭建
  6. R packages for big data:data.table
  7. html网页跟随滚轮变化,实现桌面和移动浏览器元素随页面滚动产生动画
  8. python100例图案_python100例 21-30
  9. Redis入门到入土教程_1
  10. 【Java程序设计】异常处理