呀咧呀咧,好忙啊......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会生成依赖属性的模板.