2

我想了解Silverlight依赖项属性系统的底层细节。DependencyObject的绑定上下文

我知道DependencyObject没有显式的DataContext属性,甚至没有父类的概念。

但是,派生自DependencyObject的Behavior类具有绑定使用它所附加的DataContext作为绑定本身的源。

我的问题是:我可以从DependencyObject派生一个类,并以某种方式确定在Source上使用哪个其他对象进行绑定?或者更清楚的是:如何实现像Behavior类一样的东西?

回答

2

DataContext是一个FrameworkElement属性。通过使用父子属性继承的形式,即使子对象 (它具有目标属性)不是FrameworkElement,因此 因此不支持,绑定系统可以解析存在于父元素上的一个 DataContext它自己的DataContext值。但是,该父元素必须是FrameworkElement才能设置并保留 DataContext。或者,您必须定义绑定,使其可以用空DataContext运行。

使用Silverlight 4开始,目标也可以是DependencyObject的一个 的DependencyProperty在下列情况下:

  • 的DependencyObject的是一个属性的值一个FrameworkElement。

  • DependencyObject位于集合中,该集合是FrameworkElement属性(例如,Resources属性)的值 。

  • DependencyObject位于DependencyObjectCollection中。

使用Silverlight 5开始,目标也可以是一个样式内的设置器的Value属性 。有关示例,请参阅Style类 概述。

所以回答你的问题是:是的,你可以派生自DependencyObject并在其依赖属性绑定你的类只要上面列出的条件满足或结合不依赖于DataContext的(的ElementName或来源将工作使用的属性)

+0

但还有一点值得注意:在将自定义DependencyObjectCollection附加到FrameworkElement并在其中插入DependencyObject的测试中,它确实(与ResourceDictionary行为不同)不是继承绑定的DataContext。 这项工作应该还是以另一种方式附加DataContext - 将DependencyObjects继承到现有的FrameworkElements? 或换句话说,正如我在原始问题中所问的:我可以重新实现Behavior类吗? – John

+0

我不知道行为究竟如何,但是因为它们存在,所以可以做到。出于好奇,为什么要重新实施Behavior类?为什么不使用Microsoft提供的行为? – Denis

+0

您的观点是,Behavior类是表达式混合库的一部分,而不是核心,对吧?至于为什么不使用行为:我只是把它们提出来让我的问题清楚,我的真正意图是简单地理解什么是可能的,哪些不是。 – John