带有固定标题的ComboBox

时间:2016-09-08 11:48:46

标签: c# wpf xaml combobox

我需要在ComboBox中显示默认文本,当用户选择Combobox的项目时,此文本也不会更改,实际上为此我创建了此结构:< / p>

<ComboBox ItemsSource="{Binding AvailableNations}" Width="160" Height="55" Margin="0, 0, 0, 15" 
           Text="Select Countries" IsEditable="True">
     <ComboBox.ItemTemplate>
         <DataTemplate>
             <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Item.Name}" />
         </DataTemplate>
     </ComboBox.ItemTemplate>
</ComboBox>

此显示为默认文本Select Countries,但如果我选择一个项目,默认文本将消失,并且将显示所选项目,我该如何解决此问题?

2 个答案:

答案 0 :(得分:2)

您可以使用组合模板(ref post

<Window.Resources>
    <ResourceDictionary>
        <DataTemplate x:Key="NormalItemTemplate" >
            <CheckBox IsChecked="{Binding IsChecked}" Content="{Binding Item.Name}" />
        </DataTemplate>
        <DataTemplate x:Key="SelectionBoxTemplate" >
            <TextBlock>Select Countries</TextBlock>
        </DataTemplate>
        <DataTemplate x:Key="CombinedTemplate">
            <ContentPresenter x:Name="Presenter"
                   Content="{Binding}"
                   ContentTemplate="{StaticResource NormalItemTemplate}" />
            <DataTemplate.Triggers>
                <DataTrigger
                        Binding="{Binding RelativeSource={RelativeSource FindAncestor,ComboBoxItem,1}}"
                        Value="{x:Null}">
                    <Setter TargetName="Presenter" Property="ContentTemplate"
                            Value="{StaticResource SelectionBoxTemplate}" />
                </DataTrigger>
            </DataTemplate.Triggers>
        </DataTemplate>
    </ResourceDictionary>
</Window.Resources>
<Grid>
    <ComboBox ItemsSource="{Binding AvailableNations}"                  
              SelectedItem="{Binding SelectedNation}"
              ItemTemplate="{StaticResource CombinedTemplate}"
              Width="160" Height="55" Margin="0, 0, 0, 15" >
    </ComboBox>
</Grid>

原始答案中描述了它的工作方式。请注意,建议的解决方案仅在IsEditable设置为false时才有效,我认为在您的情况下不会出现问题。其次,为了在启动时显示文本,我绑定了SelectedItem(例如,绑定到集合中的第一个项目)。

答案 1 :(得分:1)

comments开始,您可能希望始终显示Select Countries文字,即使选择了某个项目也是如此。

就个人而言,我只是走简单路线并在TextBox之上放置一个ComboBox,并使用透明前景颜色隐藏ComboBox的显示文本。

以下是一个展示它的快速示例:

<Grid>
    <ComboBox SelectedIndex="1" Foreground="Transparent">
        <ComboBox.Resources>
            <Style TargetType="{x:Type ComboBoxItem}">
                <!-- Make sure ComboBoxItems don't have transparent text -->
                <Setter Property="Foreground" Value="{StaticResource {x:Static SystemColors.ControlTextBrushKey}}" />
            </Style>
        </ComboBox.Resources>
        <ComboBoxItem>Test 1</ComboBoxItem>
        <ComboBoxItem>Test 2</ComboBoxItem>
        <ComboBoxItem>Test 3</ComboBoxItem>
    </ComboBox>

    <TextBlock Text="Select Countries" Margin="4,3" IsHitTestVisible="False" />
</Grid>

结果(注意SelectedIndex = 1

enter image description here

我确定还有其他方法,例如覆盖它绘制显示文字的方式,或更改控制模板,但这对我来说似乎最简单。