2010-01-20 177 views
0

我创建了两个自定义ComboBox控制,无论是从默认ComboBox控制继承:自定义组合框控件里面的其他自定义组合框控件,如何绑定项目?

public BlueComboBox : ComboBox {} 
public WhiteComboBox : ComboBox {} 

BlueComboBox包含模板和正确的风格和完美的作品。 WhiteComboBox有点复杂。它包含一个由TextBlockBlueComboBox组成的模板。

代码段不正确,但你应该得到的想法:

<ControlTemplate> 
    <Grid> 
    <TextBlock /> 
    <BlueComboBox /> 
    </Grid> 
</ControlTemplate> 

这里是棘手的部分:因为WhiteComboBoxComboBox控制,我想在BlueComboBox结合的项目在我的WhiteComboBox控制设置的。

<WhiteComboBox> 
    <ComboBoxItem Content="Foo" /> 
    <ComboBoxItem Content="Bar" /> 
</WhiteComboBox> 

我想结合在模板中使用到我的WhiteComboBoxItemsSource财产BlueComboBox实体的ItemSource,但似乎并没有工作:

<ControlTemplate> 
    <Grid> 
    <TextBlock /> 
    <BlueComboBox ItemsSource="{TemplateBinding ItemsSource}" /> 
    </Grid> 
</ControlTemplate> 

什么是使用的正确方法在我的WhiteComboBox实例中定义的项目到BlueComboBox实例?我是否错误地使用了ItemsSource属性,还是应该使用另一个属性?

任何帮助将不胜感激。

回答

0

你可以尝试使用的RelativeSource绑定:

<ControlTemplate> 
    <Grid> 
    <TextBlock /> 
    <BlueComboBox ItemSource="{Binding RelativeSource={RelativeSource AncestorType={x:Type ComboBox}}}, Path=Items}" /> 
    </Grid> 
</ControlTemplate> 

顺便说一句,在WPF通常的做法是使用样式改变的控制视觉方面,而不是创造派生类型。

+0

谢谢你,这个伎俩。 我正在使用样式,但每个组合框类型包含额外的DependencyProperties,因为我相当新的创建我自己的自定义控件基于他们是最简单的方法来做到这一点。 – Jensen 2010-01-20 14:58:14

0

我遇到了第二个问题。

我设计了ItemContainerStyle属性并设置了一个SystemColors.HighlightBrushKey值。当我自己使用BlueComboBox时,当我将鼠标悬停在某个项目上时,该功能完美无缺。但是,当我将我的BlueComboBox嵌入到新控件中时,当我使用ItemsSource模板绑定时不再有效。当我直接将我的控件模板中的一些ComboBoxItem添加到BlueComboBox项目时,它再次运行。当我明确点击一个项目时它也可以工作。

我试着在我的WhiteComboBox控件模板上设置ItemContainerStyle属性并将其传递给下方,但我所尝试的任何东西似乎都无能为力。