.Net中的依赖属性是什么(特别是在WPF上下文中)。与常规财产有什么区别?
答案 0 :(得分:91)
依赖属性是从DependencyObject派生的类的属性,它们的特殊之处在于它不是简单地使用支持字段来存储它们的值,而是在DependencyObject上使用一些辅助方法。
关于它们最好的事情是它们内置了数据绑定的所有管道。如果你将它们绑定到它们,它们会在它们发生变化时通知它。
答案 1 :(得分:88)
我发现唯一有用且写得很好的解释是这一个:http://www.wpftutorial.net/dependencyproperties.html
基本上,DependencyProperties与常规属性的不同之处在于它们不仅仅是类中字段的setter / getter,而是在运行时动态检索它们的实际值。 DP的SetValue()
方法非常简单,并将属性的本地值设置为您给出的值。但是,当您尝试从DependencyProperty GetValue()
时,它将首先查找本地值,如果不存在(这在DependencyProperties中不同于常规属性)它将继续向上逻辑UI树,直到它找到这样的价值。如果框架已到达树的顶部而未找到任何本地值,则它将使用预定义的默认值作为属性的值。
此方法允许DependencyProperties比常规属性消耗更少的内存,因为只有用户显式设置的值才会存储在本地。
并且,如上所述,DependencyProperties还允许我们在XAML代码中绑定它们并在它们上设置触发器,这在常规属性上是不允许的。
我希望我已经设法澄清了一些模糊性:)
答案 2 :(得分:36)
http://techpunch.wordpress.com/2008/09/25/wpf-wf-what-is-a-dependency-property/在WF和WPF的上下文中提供了依赖属性的一个很好的解释。
摘录:
关键点 - 依赖属性的值已得到解决
依赖属性的最终目标,就像任何属性一样,是管理状态。但与普通.Net属性不同,本地属性值不存储在实例变量中。
相反,依赖项属性在依赖项属性框架中注册,并且底层属性值已解析 - 这意味着该值由依赖项属性框架根据属性注册定义的规则确定。
答案 3 :(得分:7)
这样想:
人类有很多与之相关的信息。无数数百个数据与您相关 -
你手指多少,
有多少脚趾,
你有多少个BRCA2基因等
我们希望能够直接向那些向我们询问自己的人提供答案。
所以问题是:你怎么能记住所有这些?嗯,最初人们开始写下所有这些东西,但很快他们意识到他们需要携带大约10卷的黄页 - 基本上整个亚历山大图书馆(硬拷贝格式)在他们的后袋里能够回答所有这些问题:这些问题太多了。
所以有人有一个好主意。他们注意到大多数时候,信息是一样的。例如大多数人都有:
一颗心
一张脸等
三种BRCA2基因
每个人都不需要在后袋中携带大约30磅的纸张。您可以将所有这些信息存储在一个中央库中的一个地方中。人们可以随意走动而不会因携带这些信息而负担沉重。
但总有例外......不是每个人都有相同的血型,或头上有相同数量的毛囊。如果与常规存在差异或异常,那么您只需将这些例外情况随身携带在您的后袋中,而不是整本书架上。请记住,在大多数情况下,人们是非常相同的 - 他们共享相同的价值,这很少改变。如果您没有在后面的口袋中写下异常,那么您可以简单地将访问者转介到存储在公共存储库中的数据。
让我们试试这个例子吧。
我们有一个人的实例:唐纳德特朗普。一位新闻记者问我们尊敬的总统一些问题:
“特朗普总统先生,你有多少个HIF1A基因?”唐检查了他的后兜。那里没有列出他有多少基因。所以他只是告诉记者他有其他人的默认号码。 “与其他人一样,”特朗普说。 “你可以在图书馆找到答案”。所以记者只是去图书馆了解那个特定的细节。
“特朗普总统先生,你有多少面孔?
可以在本地解决此值吗?看起来这个值是在本地解决的,因为在特朗普的后口袋里有答案:2 - 它会立即返回给记者。
为了简化它,首先要解决问题,然后再向上解决问题,如果信息没有包含在那里,那么问题会转到更高的权威:上帝或意大利面条怪物作为案件可能是。最后,你会越来越高,直到得到答案。最后,所有答案都得到解决。
这意味着Prez先生给一位问他问题的记者的答案取决于别人说的话。例如,如果记者问Prez先生他是否是一位好总统,那么所提供的答案可能完全取决于另一个财产。
简而言之,依赖项属性是一种属性,可以根据具体情况在本地或在UI树中解析。我们这样做的原因是因为UI元素有数百个属性,如果要将它们存储为每个元素的支持字段,很快就会占用你的内存。由于大多数这些字段从未或很少更改,因此无需将它们存储为支持字段,并且可以通过上升树来解析它们的值。当然,这个比喻有点紧张,但我希望它对某人有帮助(最重要的是可记忆)。
**还在等待特朗普答应的(火)墙。需要保持垃圾邮件出局。