简单来说,依赖属性是脱离了普通对象的,可以随便“注入”监视的值。这就好象是把原本放在你的对象内部的属性,拿出去离散地在一个内存数据库里统一管理。在XAML风格的软件开发技术中,底层大量需要双向绑定支持,因此需要这种统一地“注入”式的数据管理模式。

解决方案 »

  1.   

    比如说你编写一个叫做 ABC 的功能丰富的自定义控件,你会为它编写 Grid.Row 属性么?不会的。那么你在 XAML 中会为其实例声明 Grid.Row 属性么?会的!编译器在解析 XAML 里边的 <local:ABC .... Grid.Row="2" .... > 这种代码时,就会调用Grid类上的SetXXX方法public static void SetRow(UIElement element, int value)
    {
    if (element == null)
    {
    throw new ArgumentNullException("element");
    }
    element.SetValue(Grid.RowProperty, value);
    }
    你并不需要为你的ABC定义一个Grid.Row属性,而是Grid可以将这个值(也就是2)注入到你的这个ABC类型的控件实例。
      

  2.   

    ??最近咋这么多 u010xxxx 滴贴子,怎么csdn也开始流行 组团提问了,呵呵,n年前玩传奇,一个矿洞都是"xx工作室001号矿工",感情这里也流行u010家族了是吧
      

  3.   

    我个人的理解是:依赖项属性是对公共语言运行时 (CLR) 属性功能的扩展。
    XAML中设置属性: <Button Background="Red" Content="Button!"/>依赖项属性提供用来扩展属性功能的功能,包括:
    资源、数据绑定样式、动画、元数据重写、属性值继承、WPF设计器集成 (具体事例,可阅读msdn)
    其中,资源、数据绑定样式应该是比较常见的,反正我平时主要是用这两个功能
    说白了,就是属性设置的一种更高级的方法,是一种补充
      

  4.   

    准确的说明,还是参考msdn吧:http://msdn.microsoft.com/zh-cn/library/ms753192.aspx
      

  5.   

    呵呵,msdn有时候就像是大众菜谱,其实很少人看菜谱而成为高级厨师的。高级的厨师往往对“一把盐、一点点酱”掌握于心,而那些在大众菜谱上则往往都是泛泛而谈。
      

  6.   

    我已经看了些关于依赖项属性的资料了,不过,我就是想知道,对于上面的代码,依赖项属性不同于普通的.NET属性的特殊功能,在什么地方体现出来了呢?
    或者,你可以举个小例子,来说明下依赖项属性的特殊功能
      

  7.   

    是csdn的注册搞怪,把会员名隐藏,显示ID,u的意思是uid,后面是ID号。
      

  8.   

    我就是想知道,对于上面的代码,依赖项属性不同于普通的.NET属性的特殊功能,在什么地方体现出来了呢?
     或者,你可以举个小例子,来说明下依赖项属性的特殊功能 
      

  9.   

    依赖
    这个中文词读懂没有,读懂了我们就不解释了如果是弄不明白这就google这几个“AOP 属性注入 解依赖”。虽然说你搜到肯定不是什么WPF资料,但是恰恰解释了你的疑问
      

  10.   

    至于你说要什么例子什么体现什么依赖属性的特殊功能,对不起,这个没有。依赖属性和微软那个asp.net mvc一样只是学人家的东西,他木有啥本质上的特殊功能,他只能说是一种软件方法学,软件工程学的应用
      

  11.   

    你学会了XAML了么?美工也可以编写过去只有程序员才能编写的许多应用程序。可能你认为一堆“属性、模板”等等概念对于微软的ide或者wpf/silverlight是“天经地义”的,但是如果你想知道一点例子,其实我已经给你点到了方向。你可以去找更多的依赖属性证据。
      

  12.   

    msdn:看见msdn说什么没有,换成大白话就是“如果A的计算依赖与B的输入,那么如何在B更改的同时引发A的变动”,如果A类和B类是独立开发的,按照传统的方法开发,A和B就必须有明确的引用关系和消息通知(或者构造公用上下文对象,通过上下文对象协调管理)。而如果采用依赖项方式,你就可以直接采用注入方式你就可以直接把B类的某个属性挂接到B类的某个属性上---虽然微软内部仍然会有复杂的上下文通知,但是我们这些使用者则很简单
    所以,这里不存在什么依赖项属性的非常特殊功能,他没有什么特殊的地方,只是从使用上他比传统的代码要简化很多
      

  13.   

    依赖属性是为属性提供一个类型。
    比如WPF的动画系列方法,其中一个参数的类型是依赖属性,这样该方法不用关注是要让什么类产生动画,怎么产生动画,这种抽象用传统属性是没法实现的。
      

  14.   

    xaml编程中大量使用了binding,把某个控件的属性绑定到其它属性上,虽然支持普通属性的绑定(后台代码不支持普通属性的绑定),但是唯有依赖性属性可以提供双向通知,普通属性可以通过继承INotifyPropertyChanged接口来实现类似功能,一般用在DataGrid的绑定中。
    相比通过INotifyPropertyChanged接口提供通知,依赖项属性性能低(有人说性能高,那是错误认识)。除非必要情况,否则别定义实体类的属性为依赖项属性,实体类应该使用INotifyPropertyChanged接口来提供通知。
    依赖项属性的实现类似定义一个Dictnary,属性值的添加就是往Dictnary添加的过程,因此如果属性不是全部都用到的情况下,会节省内存消耗,但是实体类是所有属性都会用到,这种情况下使用依赖项属性反而会降低处理速度。而且Dictnary内容增大的同时,查找速度也会减慢,因此依赖项属性只适合用在自定义控件的属性上面,其它场合不适合。
      

  15.   

    set { SetValue(TextProperty, value); }到底是设置的什么东西的值呢,TextProperty?TextProperty是静态的啊、只读的啊
      

  16.   

    我已经让你google“AOP 属性注入 解依赖”了如果你看过就知道在net这块,分静态IL植入,和动态代理两块你看到的代码是一个故事,实际运行的代码又是另一个故事,语法糖之所以是语法糖的意思是,这是语法上的糖,而不是实际运行的代码
      

  17.   

    我突然想到一个例子。
    比如在一个页面上有大量的控件,为了分清楚代码结构,我们会采用用户控件或者自定义控件将代码分块。
    分块以后的控件分别都是独立的控件,但是作为画面整体,他们之间存在一定的联系,原本在winform中,需要通过消息传递或者参数调用的方式,比如 new child(parent) 创建子控件时将父控件带进去来调用父控件的函数。
    但是WPF的依赖属性,可以做到 A控件依赖B控件的某个属性,我们只需要建立对应关系,而必须考虑传递的过程。不知道我这样的理解是否正确?