关于依赖注入和依赖属性

呀咧呀咧,好忙啊......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,依赖属性:

个人理解的依赖属性的特点:

  1. 静态:静态意味着该属性可以被很多类实例共享,于是可以实现多个同类控件的数据联动
  2. 字典类型:外部调用类属性的时候,通过字典查询获得依赖属性值
  3. 注册:依赖属性需要通过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