关于依赖注入和依赖属性
呀咧呀咧,好忙啊......ASP.Net的博客先停更了,记点随笔吧......
先说依赖注入:
一辆车需要轮子,可以用抓地好的,也可以用极速高的.
那么轮子(比如两种):
public class HighSpeedTire : Tire {//..........public override void Spin(){//Do something. } }public class HighGripTire : Tire {//..........public override void Spin(){//Do something. } }
但是我们事先不知道用什么轮子?
public class Car {public void Drive() {Tire tire = ???tire.Spin();} }
"???"该写什么呢?那么重载一下?那万一之后又新增10种轮胎怎么办?(还要不要人活了?客户经理你吃屎啊?当初你不说有这么多轮胎?2333)
所以这个时候,(锵锵!)依赖注入(or 反转控制)登场:
public class Car {private Tire tire;public Car(Tire tire){this.tire = tire;}public void Drive() {tire.Spin();} }
之后,不管什么tire装上来都可以轻松应对!
Then,依赖属性:
个人理解的依赖属性的特点:
- 静态:静态意味着该属性可以被很多类实例共享,于是可以实现多个同类控件的数据联动
- 字典类型:外部调用类属性的时候,通过字典查询获得依赖属性值
- 注册:依赖属性需要通过DependencyProperty.Register([属性名],[属性类型],[属性所有者类型],[元数据信息])方法进行注册才能使用(此处采用的静态构造函数注册)
public partial class MyButton : Button {public static DependencyProperty PressedImageProperty;//依赖属性public string PressedImage {get { return (string)GetValue(PressedImageProperty); }set { SetValue(PressedImageProperty, value); }}static MyButton() { //静态注册PressedImageProperty = DependencyProperty.Register("PressedImage", typeof(string), typeof(MyButton),new FrameworkPropertyMetadata(""));}public MyButton () {InitializeComponent();}
以上的内容仅是讲解依赖属性的实质,不涉及到应用,接下来是使用:
Binding buttonToCaculate = new Binding("CaculateCommand") { Source = (CaculatorViewModel)DataContext }; this.button1.SetBinding(Button.CommandProperty, buttonToCaculate); this.button2.SetBinding(Button.CommandProperty, buttonToCaculate);
这里的CommandProperty就是一个依赖属性,通过以上代码,我们就可以实现两个按钮对同一个操作的绑定,当我们有很多个按钮的时候,因为没有了重复的数据(依赖属性是静态的属性字典,多个具有相同属性的实例共用一组字典值),就会显著降低内存占用.其次,依赖属性有效适用于以下情形:某个类会有很多个实例,而且大部分的类实例具有相同的属性,但是你也没办法将那一小部分的实例独立成其他类.
举个栗子:人有手&脚&头&头发,但是有的人没有头发,你会将它独立为"光头人"么?用依赖属性将它们全部默认为Not Null(占用极少内存),个别光头就给他Null,解决.
这就是所谓的数据绑定,数据绑定,按照本人的理解,应该是MVVM的基础,架构MVVM的时候,就需要这样进行数据绑定,实现界面和后台代码的解耦(操作全部在ViewModel中通过调用Command执行).
另外有个小技巧:VS中键入"propdp"后连按两次TAB会生成依赖属性的模板.
转载于:https://www.cnblogs.com/snys98/p/4423312.html
关于依赖注入和依赖属性相关推荐
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取 Activity 中的所有方法 | 获取方法上的注解 | 获取注解上的注解 | 通过注解属性获取事件信息 )
文章目录 前言 一.获取 Activity 中的所有方法 二.获取方法上的注解 三.获取注解上的注解 四.通过注解属性获取相关事件信息 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...
- 依赖注入?依赖注入是如何实现解耦的?
如何用最简单的方式解释依赖注入?依赖注入是如何实现解耦的? 第一章:小明和他的手机 从前有个人叫小明 小明有三大爱好,抽烟,喝酒-- 咳咳,不好意思,走错片场了.应该是逛知乎.玩王者农药和抢微信红包 ...
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 创建 事件监听器 对应的 动态代理 | 动态代理的数据准备 | 创建调用处理程序 | 创建动态代理实例对象 )
文章目录 前言 一.创建 事件监听器 对应的 动态代理 二.动态代理 数据准备 三.动态代理 调用处理程序 四.动态代理 实例对象创建 前言 Android 依赖注入的核心就是通过反射获取 类 / 方 ...
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入具体的操作细节 | 获取要注入事件的 View 对象 | 通过反射获取 View 组件的事件设置方法 )
文章目录 前言 一.获取要注入事件的 View 对象 二.通过反射获取 View 组件的事件设置方法并执行 前言 Android 依赖注入的核心就是通过反射获取 类 / 方法 / 字段 上的注解 , ...
- 【IOC 控制反转】Android 事件依赖注入 ( 事件依赖注入代码示例 )
文章目录 总结 一.Android 事件依赖注入示例 1.创建依赖注入库 2.声明注解 (1).修饰注解的注解 (2).修饰方法的注解 3.Activity 基类 4.动态代理类调用处理程序 5.依赖 ...
- 【IOC 控制反转】Android 视图依赖注入 ( 视图依赖注入步骤 | 视图依赖注入代码示例 )
文章目录 总结 一.Android 视图依赖注入步骤 二.Android 布局依赖注入示例 1.创建依赖注入库 2.声明注解 3.Activity 基类 4.依赖注入工具类 5.客户端 Activit ...
- spring依赖注入_Spring依赖注入
spring依赖注入 介绍: 在设计良好的Java应用程序中,这些类应尽可能独立. 这样的设计提高了组件的可重用性. 它还使对各个组件进行单元测试变得更加容易. 依赖注入的概念促进了Java对象之间的 ...
- java依赖注入_Java依赖注入选项
java依赖注入 我想花一些时间来总结一些流行的Java依赖注入(DI)框架. 这是可用功能的高级概述. 首先,什么是依赖注入? "依赖注入是一种软件设计模式,可以删除硬编码的依赖,并可以在 ...
- php 依赖注入框架,依赖注入模式(Dependency Injection)
依赖注入模式(Dependency Injection) 由 学院君 创建于5年前, 最后更新于 10个月前 版本号 #3 18333 views 16 likes 0 collects 1.模式定义 ...
- php mvc多层依赖注入,演示依赖注入,MVC,路由案例 2019年10月12日 08:00
今晚学习了依赖注入,MVC,路由知识,课堂上听的时候感觉没有问题,实际操作的时候还是遇到了很多问题,写起比较生,没法融会贯通.总体来说还是非常不错的.现将各个功能实例如下: 1.依赖注入 实例 //依 ...
最新文章
- 漫画:骚操作系列(灯泡开关的经典面试题)
- 聊聊Synchronized
- numpy 点乘_斯坦福CS217(六)Spatial点乘示例
- word、excel、ppt 办公文件 在线预览
- 开发指南专题九:JEECG微云快速开发平台-表单校验组件ValidForm
- ios图片轮播 (基础篇——UIScrollView实现方式)
- 主数据处理链碰到空数据节点不在继续执行的问题解决方案
- KASLR-内核地址空间布局随机化
- PHP微信H5支付Demo
- 六轴传感器使用学习记录
- 谈谈EOS的出块时间,不可逆时间,BFT
- bilibili执行董事陈睿:我在进B站之前是一个正常人
- 一台电脑安装两个jdk的方法
- 找工作与找对象的关系
- 新建STM32F427IIH标准库工程
- 图深度学习——卷积神经网络循环神经网络自编码器
- java中的反射和Class类
- 【项目总结】之——JS分割字符串
- PS图层添加模式解说
- ssm毕设项目Java防作弊的电子投票系统rgobs(java+VUE+Mybatis+Maven+Mysql+sprnig)
热门文章
- linux命令前的$是什么意思,linux中$符号的基础用法总结
- GNN教程:采样模型GraphSage理解(工业上图模型的雏形)
- 【错误记录】IntelliJ IDEA 编译 Groovy 项目报错 ( gradle-resources-test:XX: java.lang.NoClassDefFoundError: org )
- fg-bg Assignment Imbalance problem
- CapstoneCS5263|DP转HDMI 4K60HZ方案|替代PS176芯片
- linux x200 黑屏,Thinkpad x200黑屏(一长两短) 复原
- 微软官方dllcache恢复的批处理
- SDH(标准DH)和MDH(改进DH)
- 二十一世纪的计算研讨会及启示
- paddleocr cpp_infer 操作说明