2011-05-19 90 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