【问题标题】:Custom ComboBox control inside other custom ComboBox control, how to bind Items?自定义 ComboBox 控件在其他自定义 ComboBox 控件中,如何绑定 Items?
【发布时间】:2010-01-20 14:41:10
【问题描述】:

我创建了两个自定义的ComboBox 控件,都继承自默认的ComboBox 控件:

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

BlueComboBox 包含一个模板,样式正确且运行良好。 WhiteComboBox 有点复杂。它包含一个由TextBlockBlueComboBox 组成的模板。

sn-p 不正确,但你应该明白了:

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

这是棘手的部分:因为WhiteComboBoxComboBox 控件,我想将BlueComboBox 中的项目绑定到我的WhiteComboBox 控件中设置的项目。

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

我尝试将模板中使用的BlueComboBox 实体的ItemSource 绑定到我的WhiteComboBoxItemsSource 属性,但这似乎不起作用:

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

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

任何帮助将不胜感激。

【问题讨论】:

    标签: .net wpf xaml data-binding combobox


    【解决方案1】:

    您可以尝试使用 RelativeSource 绑定:

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

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

    【讨论】:

    • 谢谢,成功了。我正在使用样式,但每个 ComboBox 类型都包含额外的 DependencyProperties,因为我在这方面还很陌生,因此基于它们创建自己的自定义控件是最简单的方法。
    【解决方案2】:

    我遇到了第二个问题。

    我设置了 ItemContainerStyle 属性的样式并设置了 SystemColors.HighlightBrushKey 值。当我单独使用 BlueComboBox 时,当我将鼠标悬停在一个项目上时,它可以完美地工作。但是,当我将 BlueComboBox 嵌入到新控件中时,当我使用 ItemsSource 模板绑定时,这将不再起作用。当我将控件模板中的一些 ComboBoxItems 直接添加到 BlueComboBox 项时,它会再次起作用。当我明确点击一个项目时,它也可以工作。

    我尝试在我的 WhiteComboBox 控件模板上设置 ItemContainerStyle 属性并将其传递下来,但我尝试的所有方法似乎都不起作用。

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多