• 关于依赖注入和依赖属性


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

  • 相关阅读:
    JQuery
    JS
    PHP
    Java并发编程:CopyOnWrite容器的实现
    Java并发编程:并发容器ConcurrentHashMap
    Java并发编程:同步容器
    Java并发编程:ThreadLocal
    Java并发编程:sleep、wait、yield对比
    Java并发编程:volatile关键字解析
    Java并发编程:Lock
  • 原文地址:https://www.cnblogs.com/snys98/p/4423312.html
Copyright © 2020-2023  润新知