依赖属性WPF

Aks*_*y J 18 c# wpf dependency-properties

我一直在阅读几本书中的依赖属性,但都有一个共同点,它们只是告诉我们它们是如何实现的(使用static readonly DependencyProperty等),但没有告诉它们从内部工作的确切方式.

我的意思是它们被实现为静态但仍然适用于所有对象.
第二点混淆是附加属性.

有没有可以轻松解释所有这些概念的教程?

Rob*_*ney 32

我的依赖属性如何工作的心智模型:

任何DependencyObject类都实现两个特殊属性.一个是类的静态属性,是DependencyProperty对象的字典.该类的每个实例都可以查看该字典内部以查找有关每个元素的元信息DependencyProperty- 属性的名称,类型,在获取和设置时必须调用的任何回调,它如何参与属性继承等等.注册依赖项属性时,您将向此词典添加一个条目.

另一个属性是一个实例属性:它是一个字典,键入DependencyProperty,包含每个的本地(DependencyProperty如果已设置).

SetValueGetValue您在CLR属性的setter和getter实现方法基本上都是在类固醇懒惰的评价.它们不是在支持字段中存储和检索属性的值,而是在值字典中存储和检索属性的值.

依赖属性的魔法是什么GetValueSetValue怎么做.

GetValue在对象的值字典中查找属性的值.如果找不到它,则调用GetValue父元素,以获取父元素认为该值的内容.例如,当您创建TextBoxWindow,任何看起来在TextBoxFontFamily实际上是调用GetValue.除非您明确设置了字体,否则其字典中没有该属性的条目.因此GetValue询问父元素的值.父元素可能已FontFamily设置,也可能未设置; 如果没有,调用GetValue到返回值从它的母公司.依此类推,直到Window达到对象并FontFamily找到实际值.

如果设置FontFamilyTextBox,SetValue存储在值字典中的价值.接下来的时间有什么需要得到的价值FontFamilyTextBox,GetValue在字典中查找值,并返回它,所以它并不需要问的父元素.

如果设置FontFamilyWindow,SetValue不仅更新了值Window的值的字典,它触发关闭一个属性更改事件,一切都依赖于财产听到.(这就是为什么它们被称为依赖属性,请记住.)如果依赖于属性的东西本身就是依赖属性,它会触发自己的属性更改事件.这是怎么回事,改变FontFamilyWindow改变在窗口中的每个控件的字体,也提示WPF重新渲染已更改的控制.

附属物使用相同的方法工作.任何可以附加属性的对象都有一个字典,其中存储了附加属性的值.当您在XAML中设置Grid.ColumnCheckBox,您只是在该CheckBox字典中添加一个条目.当Grid需要知道它所在的列CheckBox时,它会从该字典中查找值.当您设置Grid.IsSharedSizeScopeTrue对象时,该对象的字典将包含一个新属性 - 一个包含每个属性的宽度/高度的字典SharedSizeKey.

我应该强调这是我的心理模型.我没有带反光坐了下来,看了看实际执行Register,GetValue以及SetValue找出他们是如何工作的.我可能错了细节.但它是一个准确预测这些东西行为的模型,所以它足够好.

在字典中存储属性值的概念对C#程序员来说非常奇怪.不过,这对Python程序员来说是老生常谈的.在Python中,所有类属性 - 事实上所有对象 - 都存储在字典中,因此您可以通过属性访问器或仅通过查找它们来获取它们的值.依赖属性和附加属性只是另一种方式,其中窃取了Java值得窃取的所有内容,现在正在掠夺Python.(或者从Python掠夺它们的地方.)学习Python让我成为一个更好的C#程序员; 我推荐给尚未完成它的任何C#开发人员.

  • 这听起来对我来说,虽然"那个词典可以为CheckBox所拥有的所有属性提供键控值"应该说"依赖属性".另外我应该指出,当我写上面的帖子时,我误解了附加属性是依赖属性的机制; 实际上附加属性*是*依赖属性. (3认同)

Qua*_*ter 6

这是一个关于依赖属性http://www.wpftutorial.net/DependencyProperties.html的教程,它解释了它们的工作原理.

DependencyProperty对象在静态字段中的简要说明是它表示属性的描述,而不是属性的值.每个DependencyObject都有一个从DependencyProperty对象到其值的映射.

这也是附加属性的工作原理.因为每个DependencyObject都存储从任何DependencyProperty到值的映射,所以任何类型都可以创建新的DependencyProperty并在任何现有的DependencyObject上设置它.