Question

In my WPF app UserControl I want to set the background of the combo box. After seeking lots of help and tutorials I could achieve it as expected, but now am not able to see the selected item in the text. I mean, the selected item could be seen in drop down, but not in combo box when any drop is not clicked. I tried many variations to set the fore color of the text, but no success. Also tried thru different sites, but couldn't get everything workable. Am stuck badly since days on this. Below is my code.

    <LinearGradientBrush x:Key="NormalBrush" StartPoint="0,0" EndPoint="0,1">
        <GradientBrush.GradientStops>
            <GradientStopCollection>
                <GradientStop Color="#106594" Offset="0.0"/>
                <GradientStop Color="LightYellow" Offset="1.0"/>
            </GradientStopCollection>
        </GradientBrush.GradientStops>
    </LinearGradientBrush>

    <SolidColorBrush x:Key="WindowBackgroundBrush" Color="#106594" />

    <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="ToggleButton">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <Border x:Name="Border" Grid.ColumnSpan="2" CornerRadius="2"
                Background="{StaticResource NormalBrush}" BorderThickness="1" />
            <Border Grid.Column="0" CornerRadius="2,0,0,2" Margin="1" 
                Background="{StaticResource WindowBackgroundBrush}" BorderThickness="0,0,1,0" />
            <Path x:Name="Arrow" Grid.Column="1" HorizontalAlignment="Center" VerticalAlignment="Center"
                Data="M 0 0 L 4 4 L 8 0 Z" Fill="Black"/>
        </Grid>
    </ControlTemplate>

    <ControlTemplate x:Key="ComboBoxTextBox" TargetType="TextBox">
        <Border x:Name="PART_ContentHost" Focusable="False" Background="{TemplateBinding Background}"  />
    </ControlTemplate>

    <Style x:Key="{x:Type ComboBox}" TargetType="ComboBox">
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="ComboBox">
                    <Grid>
                        <ToggleButton Name="ToggleButton" Template="{StaticResource ComboBoxToggleButton}" 
                            Grid.Column="2" Focusable="false" 
                            IsChecked="{Binding Path=IsDropDownOpen,Mode=TwoWay,RelativeSource={RelativeSource TemplatedParent}}"
                            ClickMode="Press" >
                        </ToggleButton>
                        <ContentPresenter Name="ContentSite" IsHitTestVisible="False" 
                            Margin="3,3,23,3" VerticalAlignment="Center" HorizontalAlignment="Left" />
                        <TextBox x:Name="PART_EditableTextBox" Style="{x:Null}" 
                            Template="{StaticResource ComboBoxTextBox}" HorizontalAlignment="Left" 
                            VerticalAlignment="Center" Margin="3,3,23,3" Focusable="True" 
                            Background="Transparent" Foreground="{TemplateBinding Foreground}" Visibility="Hidden" 
                            IsReadOnly="{TemplateBinding IsReadOnly}"/>

                        <Popup  Name="Popup" Placement="Bottom" IsOpen="{TemplateBinding IsDropDownOpen}"
                            AllowsTransparency="True" Focusable="False" PopupAnimation="Slide">
                            <Grid Name="DropDown" SnapsToDevicePixels="True" MinWidth="{TemplateBinding ActualWidth}"
                                MaxHeight="{TemplateBinding MaxDropDownHeight}">
                                <Border x:Name="DropDownBorder" Background="White" BorderThickness="1"/>
                                <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
                                    <StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />
                                </ScrollViewer>
                            </Grid>
                        </Popup>
                    </Grid>
                </ControlTemplate>
            </Setter.Value>
        </Setter>

        <Style.Triggers>
        </Style.Triggers>
    </Style>

</UserControl.Resources>

USAGE :

   <ComboBox ItemsSource="{Binding MtrCm}" SelectedValue="{Binding WellboreDiameter_Unit, Mode=TwoWay}" Grid.Row="1" Height="23" HorizontalAlignment="Right" Margin="0,26,249,0" x:Name="cboWellDiameter" VerticalAlignment="Top" Width="120" />

Can anyone help me know or what setting is wrong/to be added to make it workable as required and see the selected item text in the combo box. Thanks a lot.

Was it helpful?

Solution

Are you implementing propertychanged on WellboreDiameter_Unit?

Also can you try using SelectedItem instead?

Edit - Sorry looking at your style again, I think there is something wrong with the style for ContentPresenter. I will have a look again and see if I can help

Edit - Your ContentPresenter is wrong, Change it to below

<ContentPresenter Name="ContentSite" IsHitTestVisible="False" 
Margin="3,3,23,3" VerticalAlignment="Center" HorizontalAlignment="Left" 
Content="{TemplateBinding SelectionBoxItem}"/>

Make sure you add the Content="{TemplateBinding SelectionBoxItem}" and you should see the selectedItem

Licensed under: CC-BY-SA with attribution
Not affiliated with StackOverflow
scroll top