我如何设置我的ComboBox以及它在WPF中的项目?

时间:2013-02-04 18:19:09

标签: wpf combobox itemtemplate

我有一个ComboBox,我想用一些自定义样式设置样式。我成功地提供了所需的风格。在风格中,我有以下要素:

  • 切换按钮的模板
  • 包含ComboBox项目的弹出窗口

我提到的几乎所有链接都采用了相同的方法。但是使用这种方法,我无法为ComboBox中的项目提供模板。由于某种原因,我定义的项目模板不用于渲染项目。有人可以帮帮我吗? 我正在粘贴代码示例以使我的问题陈述清楚(代码中可能存在错误,我只是想要继续)。

 <Window.Resources>
    <Style x:Key="{x:Type ComboBox}" TargetType="{x:Type ComboBox}">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate>
                    <Grid>
                        <ToggleButton Template="{StaticResource MyToggleButton}"/>
                        <Popup >
                            <StackPanel>
                                <Border/>
                                <ItemsPresenter/>
                            </StackPanel>
                        </Popup>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</Window.Resources>
<Grid>
    <ComboBox Style="{StaticResource MyStyle}">
        <ComboBox.ItemTemplate>
            <DataTemplate>

            </DataTemplate>
        </ComboBox.ItemTemplate>
    </ComboBox>
</Grid>

1 个答案:

答案 0 :(得分:1)

如果您尝试为ComboBoxItem控件提供不同的ControlTemplate,则需要将ComboBox上的ItemContainerStyle属性设置为类似于您已使用父控件完成的样式,但对于ComboBoxItem。 ItemTemplate定义了一个DataTemplate,用于应用于每个项目的数据,然后将其注入到ComboBoxItem ControlTemplate中。

<ComboBox Style="{StaticResource MyStyle}">
    <ComboBox.ItemContainerStyle>
        <Style TargetType="{x:Type ComboBoxItem}">
            <Setter Property="Template">
                <Setter.Value>
                    <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                        <Border>
                            <ContentPresenter/> <!--ItemTemplate is injected here-->
                        </Border>
                    </ControlTemplate>
                </Setter.Value>
            </Setter>
        </Style>
    </ComboBox.ItemContainerStyle>
    <ComboBox.ItemTemplate>
        <DataTemplate>
            <TextBlock Text="{Binding Path=SomePropertyOnMyDataObject}"/>
        </DataTemplate>
    </ComboBox.ItemTemplate>
</ComboBox>