WPF 中依赖属性的继承(Inherits)
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));
}
可以看到,使能依赖属性的基础大体上要如下几步:
- 使用FrameworkPropertyMetadataOptions.Inherits使用标记源属性
- 使用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)相关推荐
- javascript中依赖属性(Dependency Property)的实现
好久没在首页发点东西了,昨天在js上依照wpf中依赖属性的思想尝试写了基本的功能.这里拿出来与大家分享 Demo1 注册依赖属性 step1 定义一个函数 function Person() {thi ...
- WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性
原文:WPF 使用依赖属性(DependencyProperty) 定义用户控件中的Image Source属性 如果你要自定义一个图片按钮控件,那么如何在主窗体绑定这个控件上图片的Source呢? ...
- WPF的依赖属性和附加属性(用法解释较全)
转:https://www.cnblogs.com/zhili/p/WPFDependencyProperty.html 一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己 ...
- 面试总结(CSS 的盒模型?、CSS 中选择器的优先级以及 CSS 权重如何计算?、CSS 中哪些属性可继承,哪些不可以?、CSS 单位中 px、em 和 rem 的区别?、rem 适配....)
CSS 的盒模型? 盒子模型(Box Modle)可以用来对元素进行布局,包括内边距,边框,外边距,和实际 内容这几个部分 第一种是 W3C 标准的盒子 ...
- WPF之依赖属性和附加属性
参考资料: 一站式WPF--依赖属性(DependencyProperty)一 一站式WPF--依赖属性(DependencyProperty)二 依赖属性之我见: 这两篇文章介绍的 ...
- CSS 中哪些属性可以继承?
每个CSS属性定义的概述都指出了这个属性是默认继承的,还是默认不继承的.这决定了当你没有为元素的属性指定值时该如何计算 值. 当元素的一个继承属性没有指定值时,则取父元素的同属性的计算值.只有文档根元 ...
- WPF快速入门系列(2)——深入解析依赖属性
一.引言 感觉最近都颓废了,好久没有学习写博文了,出于负罪感,今天强烈逼迫自己开始更新WPF系列.尽管最近看到一篇WPF技术是否老矣的文章,但是还是不能阻止我系统学习WPF.今天继续分享WPF中一个最 ...
- 初步了解WPF依赖属性
一 依赖属性 在WPF库实现中,依赖属性使用普通的C#属性进行了包装,使得我们可以通过和以前一样的方式来使用依赖属性.但必须明确,在WPF中我们大多数都在使用依赖属性,而不是使用属性.依赖属性重要性在 ...
- WPF整理-为User Control添加依赖属性
WPF整理-为User Control添加依赖属性 原文:WPF整理-为User Control添加依赖属性 依赖属性 ".NET properties are nothing more t ...
最新文章
- 设置RGBColor
- 【 MATLAB 】使用 impz 函数计算并画出脉冲响应
- Mysql 查询一天中每半小时记录的数量
- python pkl是什么类型的文件?怎么来打开它?(使用numpy和pickle都能打开)
- 《淘宝网开店 拍摄 修图 设计 装修 实战150招》一一1.2 选购镜头时应注意的事项...
- 第十三节:实际开发中使用最多的监视锁Monitor、lock语法糖的扩展、混合锁的使用(ManualResetEvent、SemaphoreSlim、ReaderWriterLockSlim)
- django-命名空间与反向解析-模板反向解析-视图反向解析
- ResourceExhaustedError 解决方案
- 程序员面试金典——11.3元素查找
- 《Unity虚拟现实开发实战》——第1章,第1.1节虚拟现实对你来说意味着什么
- [ZZ]为什么传统的自动化测试工具会扼杀敏捷?
- graphpad多条不同的曲线_GraphPad绘制几种常见散点图教程
- matlab帧差法图像识别
- 金盾播放器android安卓,(金盾高级视频加密系统跨平台播放器Android安卓安装步骤.doc...
- cad卸载不干净_BarTender卸载卸不干净的解决技巧
- 2022-2027年中国家用清洁产品行业发展监测及投资战略研究报告
- 经典基础教程---Programming TCP/IP Windows Sockets in C++
- 10 Kafka集群与运维
- 免费送5000多G之java,javaweb,python,大数据,区块链,安卓等的学习资源
- 微机原理知识点总结9(8255A+8251A)
热门文章
- 苹果6重置系统后无服务器,iphone6总是无服务,恢复初始设置就好了,然后一两天又不行了,怎么处理...
- 关于项目404解决方法:前提条件:项目路径都是正确的
- 为什么华为a1路由器网速变慢_路由器需要每天都关吗?看完专家的解释恍然大悟...
- 因分辨率变化html页面布局跳动_Web前端页面设计流程及注意事项,谨记!
- java 中button和jbutton输出的按钮不一样_Java学习教程(基础)--Java开发环境搭建
- R packages for big data:data.table
- html网页跟随滚轮变化,实现桌面和移动浏览器元素随页面滚动产生动画
- python100例图案_python100例 21-30
- Redis入门到入土教程_1
- 【Java程序设计】异常处理