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