2011-05-19 102 views
1

如果你看看SelectorTabItem類他們顯然都擁有IsSelectedProperty依賴屬性 - 擁有2個所有者有什麼意義?

static Selector() 
{ 
    ... 
    IsSelectedProperty = DependencyProperty.RegisterAttached("IsSelected", typeof(bool), typeof(Selector), ...); 
    ... 
} 

static TabItem() 
{ 
    IsSelectedProperty = Selector.IsSelectedProperty.AddOwner(typeof(TabItem), ...); 
    ... 
} 

所以我想我的問題是...因爲TabItem的包含實際的PropertyChanged邏輯是什麼的IsSelectedProperty甚至居住在Selector類的呢?

回答

2

在這種特定的情況下,SelectorIsSelected DP因爲有一些從它其可以選擇項(ComboBoxListBox得到控制, ListViewTabControlDataGrid)。他們都需要能夠用IsSelected來標記項目,因此該DP是在其公共基類中聲明的。像Tim說的那樣,DRY。

另一個原因是TabItem增加了自身作爲所有者是在Selector類,IsSelected是附加屬性,因爲你可以有任何一樣東西如在Selector的項目。附加屬性的移動性非常好。

然而,TabItem增加本身作爲所有者,使得它不是TabItem附加屬性。它還會註冊一個回調方法,以便在值更改時調用,以便在選擇或取消選擇時可以執行一些操作。

是的,在Intellisense中輸入<TabItem並查看IsSelected比更容易,「但是我怎麼讓一個人入選?」。並且不得不四處尋找,並發現您需要使用其他課程的附加屬性。

+0

所以基本上在選擇器類被定義爲給它廣泛可用性要在多個控件使用,但需要的TabItem它的所有權,使得當值改變它可以註冊回調和還避免''?此外,您在說Selector將其標記爲AttachedProperty,因爲它只是爲了讓其他屬性使用它而已,並不是說它是在Selector實例中使用的屬性。 – michael 2011-05-19 14:36:18

+0

非常。它不被_Selector's使用,而是間接地通過它們的項目和內部(想象多重選擇切換)。 'ListBoxItem'和'DataGridRow'也使用回調(和'ListViewItem'繼承'ListBoxItem')。有IsSelectedDependencyProperty'的'一個原始實例堅持設計和全依賴產權制度的理念,自'IsSelected'在所有這些背景完全相同的使用和意義。還有'SelectedEvent','UnselectedEvent'等等(例如,'ListBoxItem'對它們做'AddOwner')。 – 2011-05-19 15:21:06

1

它基本上只是DRY(不要重複自己)的一個實例。下面是從MSDN論壇上的話題線程:

DependencyProperty.AddOwner - What's the Point

+0

這似乎是有道理的,除了在這個例子中,原產權登記作爲附加屬性的事實。這個組合似乎沒有意義,因爲附加屬性通常需要執行諸如'

+0

請參閱Joel B Fant的答案,以進一步說明TabItem將自己作爲所有者添加時所做的更改。 – Tim 2011-05-19 13:56:24

相關問題