什么是依赖属性?
.Net中的依赖属性是什么(特别是在WPF上下文中)。 与普通物业有什么不同?
依赖属性是从DependencyObject派生的类的属性,它们是特殊的,而不是简单地使用一个支持字段来存储它们的值,他们在DependencyObject上使用一些辅助方法。
关于他们最好的事情是,他们拥有所有的内置数据绑定的pipe道。如果你绑定了一些东西给他们,他们会在他们改变时通知它。
我发现唯一的解释是帮助和写得很好: http : //www.wpftutorial.net/dependencyproperties.html
基本上,DependencyProperties与常规属性的不同之处在于它们不只是类中字段的setter / getters,而是在运行时dynamic地检索它们的实际值。 DP的SetValue()
方法非常简单,并将属性的本地值设置为您给它的值。 但是,当您从DependencyProperty中尝试GetValue()
,它将首先查找本地值(如果不存在(在DependencyProperties中可行,不像常规属性),它将继续在逻辑UI树上,直到find这样的值。 如果框架已经到达树的顶部而没有find任何本地值,则会使用预定义的默认值作为属性的值。
此方法允许DependencyProperties消耗比常规属性更less的内存,因为只有由用户明确设置的值才会被本地存储。
而且,如上所述,DependencyProperties也允许我们在XAML代码中绑定它们,并在它们上设置触发器,这些触发器在常规属性上是不允许的。
我希望我已经设法清除一些模糊:)
摘录:
要点 – 解决依赖属性的价值
像属性一样,依赖属性的最终目标是pipe理状态。 但是,与普通的.Net属性不同,本地属性值不会存储在实例variables中。
相反,依赖属性被注册到依赖属性框架中,并且基础属性值被parsing – 意味着该值由依赖属性框架基于由属性注册定义的规则来确定。
没有代码的解释
像这样想:
每个人都差不多
人类有很多与他们有关的信息。 无数的数以千计的数据与你有关 – 你有多less手指,多less脚趾,你有多lessBRCA2基因等等。
现在是问题:有人可能会在任何时候问你这些问题,你应该能够给他们一个直接的答案。
所以问题是:你怎么能记住所有这些? 那么原本人们开始写下所有的东西,但是很快他们意识到他们需要在后面的口袋里拎着亚历山大的整个图书馆来回答所有这些问题:这样的东西太多了。
将共同的信息存储在一个地方
所以有人有一个好主意。 他们注意到大部分时间,信息是一样的。 大多数人拥有相同的数据,而且很less发生变化。 大多数人有:
- 一心
- 一个脸等
- 三个BRCA2基因
没有必要每个人都携带这些信息。 您可以将所有这些信息存储在一个中央图书馆中的一个地方 。 但是总是有例外……如果你有任何例外,那么你只需把这些例外随身携带在你的口袋里。 在大多数情况下,人们是非常相同的 – 他们分享他们相同的价值观,这很less改变。 如果您没有写下exception,那么您可以简单地将访问者引用到存储在公共存储库中的数据。
例如:记者采访唐纳德·特朗普总统**
我们来看一个例子。
我们有一个人的例子:唐纳德·特朗普。 有记者问我们尊敬的总统有几个问题:
“特朗普总统,你有多lessHIF1A基因?”
唐纳德检查他的后兜。 这里没有列出他有多less基因。 所以他只是告诉记者,他有其他人都有的默认号码。 所以记者只是到图书馆去了解一下这个细节。
“特朗普总统,你有多less张脸?
“对不起,”唐纳德·特朗普说,没有一个尖锐的指尖 – 然后他伸到他的后兜里,检查是否有任何东西写在那里 – 这个价值可以在当地解决吗? 如果是这样,他可以简单地把他写在口袋里的价值归还 – 但如果没有什么东西的话,他可以直接把报告送到当地的图书馆find这些信息。 但是在当地有一个价值 – 在他的后面的口袋里有一个答案:他有两张脸。 这里有个例外。 所以他不能要求记者提到图书馆,因为这是个例外。 特朗普应该及时回答:2。
价值决议一棵树
为了简化,事情首先由个人解决,然后向上解决,如果信息不包含在那里,那么问题就交给上级:上帝或者意大利面条怪兽(视情况而定) 。 最后,你继续走得越来越高,直到你得到答案。 最后,所有的答案都得到解决。
概要
这就是概念。 简而言之,依赖项属性是根据具体情况在本地或在UI树上parsing的属性。 当然,这个比喻有点紧张,但我希望对某人有帮助。