Sam K
Sam K

Reputation: 410

Why does my WPF combobox displays Model name that is binded when selected?

I have a ComboBox in WPF which I Binded to an observable collection. It was all good. Recently I had to change the background of the combo box and changed the default template of it as per this article

Now the problem is the combo box displays the values that I add to the Observable collection, but when I select an item, it displays the model name. Attached are the pictures

enter image description here enter image description here

XAML Code

<ComboBox Width="120" x:Name="cmbMobileCol" ItemsSource="{Binding}" DisplayMemberPath="ColumnName" SelectedValuePath="ColumnLetter" Template="{DynamicResource ComboBoxControlTemplate1}"/>

Code Behind

public ObservableCollection<MobileCol> MobileColList = new ObservableCollection<MobileCol>();

public MainWindow()
{
  InitializeComponent();
  CmbMobileCol.DataContext = this.GetMobileColumns();
}

private void MainWin_Loaded(object sender, RoutedEventArgs e)
{
  AddMobileColumns("A", 1);
  AddMobileColumns("B", 2);
  AddMobileColumns("C", 3);
}

Combobox Template XAML

 <!--#region ComboBox Template Style-->

        <ControlTemplate x:Key="ComboBoxControlTemplate1" TargetType="{x:Type ComboBox}">
            <Grid x:Name="templateRoot" SnapsToDevicePixels="True">
                <Grid.ColumnDefinitions>
                    <ColumnDefinition Width="*"/>
                    <ColumnDefinition MinWidth="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}" Width="0"/>
                </Grid.ColumnDefinitions>
                <Popup x:Name="PART_Popup" AllowsTransparency="True" Grid.ColumnSpan="2" IsOpen="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}" Margin="1" PopupAnimation="{DynamicResource {x:Static SystemParameters.ComboBoxPopupAnimationKey}}" Placement="Bottom">
                    <Themes:SystemDropShadowChrome x:Name="shadow" Color="Transparent" MaxHeight="{TemplateBinding MaxDropDownHeight}" MinWidth="{Binding ActualWidth, ElementName=templateRoot}">
                        <Border x:Name="DropDownBorder" BorderBrush="{DynamicResource {x:Static SystemColors.WindowFrameBrushKey}}" BorderThickness="1" Background="{DynamicResource {x:Static SystemColors.WindowBrushKey}}">
                            <ScrollViewer x:Name="DropDownScrollViewer">
                                <Grid x:Name="grid" RenderOptions.ClearTypeHint="Enabled">
                                    <Canvas x:Name="canvas" HorizontalAlignment="Left" Height="0" VerticalAlignment="Top" Width="0">
                                        <Rectangle x:Name="OpaqueRect" Fill="{Binding Background, ElementName=DropDownBorder}" Height="{Binding ActualHeight, ElementName=DropDownBorder}" Width="{Binding ActualWidth, ElementName=DropDownBorder}"/>
                                    </Canvas>
                                    <ItemsPresenter x:Name="ItemsPresenter" KeyboardNavigation.DirectionalNavigation="Contained" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"/>
                                </Grid>
                            </ScrollViewer>
                        </Border>
                    </Themes:SystemDropShadowChrome>
                </Popup>
                <ToggleButton x:Name="toggleButton" BorderBrush="{TemplateBinding BorderBrush}" BorderThickness="{TemplateBinding BorderThickness}" Background="{TemplateBinding Background}" Grid.ColumnSpan="2" IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}">
                    <ToggleButton.Style>
                        <Style TargetType="{x:Type ToggleButton}">
                            <Setter Property="OverridesDefaultStyle" Value="True"/>
                            <Setter Property="IsTabStop" Value="False"/>
                            <Setter Property="Focusable" Value="False"/>
                            <Setter Property="ClickMode" Value="Press"/>
                            <Setter Property="Template">
                                <Setter.Value>
                                    <ControlTemplate TargetType="{x:Type ToggleButton}">
                                        <Border x:Name="templateRoot" BorderBrush="#FFACACAC" BorderThickness="{TemplateBinding BorderThickness}" SnapsToDevicePixels="True">
                                            <Border.Background>
                                                <!--<LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                    <GradientStop Color="#FFF0F0F0" Offset="0"/>
                                                    <GradientStop Color="#FFE5E5E5" Offset="1"/>
                                                </LinearGradientBrush>-->
                                                <SolidColorBrush Color="White"/>
                                            </Border.Background>
                                            <Border x:Name="splitBorder" BorderBrush="Transparent" BorderThickness="1" HorizontalAlignment="Right" Margin="0" SnapsToDevicePixels="True" Width="{DynamicResource {x:Static SystemParameters.VerticalScrollBarWidthKey}}">
                                                <Path x:Name="Arrow" Data="F1M0,0L2.667,2.66665 5.3334,0 5.3334,-1.78168 2.6667,0.88501 0,-1.78168 0,0z" Fill="#FF606060" HorizontalAlignment="Center" Margin="0" VerticalAlignment="Center"/>
                                            </Border>
                                        </Border>
                                        <ControlTemplate.Triggers>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="true"/>
                                                    <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="false"/>
                                                    <Condition Binding="{Binding IsPressed, RelativeSource={RelativeSource Self}}" Value="false"/>
                                                    <Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="true"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot" Value="White"/>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FFABADB3"/>
                                                <Setter Property="Background" TargetName="splitBorder" Value="Transparent"/>
                                                <Setter Property="BorderBrush" TargetName="splitBorder" Value="Transparent"/>
                                            </MultiDataTrigger>
                                            <Trigger Property="IsMouseOver" Value="True">
                                                <Setter Property="Fill" TargetName="Arrow" Value="Black"/>
                                            </Trigger>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true"/>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="false"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot">
                                                    <Setter.Value>
                                                        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                            <GradientStop Color="#FFECF4FC" Offset="0"/>
                                                            <GradientStop Color="#FFDCECFC" Offset="1"/>
                                                        </LinearGradientBrush>
                                                    </Setter.Value>
                                                </Setter>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FF7EB4EA"/>
                                            </MultiDataTrigger>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsMouseOver, RelativeSource={RelativeSource Self}}" Value="true"/>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="true"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot" Value="White"/>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FF7EB4EA"/>
                                                <Setter Property="Background" TargetName="splitBorder">
                                                    <Setter.Value>
                                                        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                            <GradientStop Color="#FFEBF4FC" Offset="0"/>
                                                            <GradientStop Color="#FFDCECFC" Offset="1"/>
                                                        </LinearGradientBrush>
                                                    </Setter.Value>
                                                </Setter>
                                                <Setter Property="BorderBrush" TargetName="splitBorder" Value="#FF7EB4EA"/>
                                            </MultiDataTrigger>
                                            <Trigger Property="IsPressed" Value="True">
                                                <Setter Property="Fill" TargetName="Arrow" Value="Black"/>
                                            </Trigger>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsPressed, RelativeSource={RelativeSource Self}}" Value="true"/>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="false"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot">
                                                    <Setter.Value>
                                                        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                            <GradientStop Color="#FFDAECFC" Offset="0"/>
                                                            <GradientStop Color="#FFC4E0FC" Offset="1"/>
                                                        </LinearGradientBrush>
                                                    </Setter.Value>
                                                </Setter>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FF569DE5"/>
                                            </MultiDataTrigger>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsPressed, RelativeSource={RelativeSource Self}}" Value="true"/>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="true"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot" Value="White"/>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FF569DE5"/>
                                                <Setter Property="Background" TargetName="splitBorder">
                                                    <Setter.Value>
                                                        <LinearGradientBrush EndPoint="0,1" StartPoint="0,0">
                                                            <GradientStop Color="#FFDAEBFC" Offset="0"/>
                                                            <GradientStop Color="#FFC4E0FC" Offset="1"/>
                                                        </LinearGradientBrush>
                                                    </Setter.Value>
                                                </Setter>
                                                <Setter Property="BorderBrush" TargetName="splitBorder" Value="#FF569DE5"/>
                                            </MultiDataTrigger>
                                            <Trigger Property="IsEnabled" Value="False">
                                                <Setter Property="Fill" TargetName="Arrow" Value="#FFBFBFBF"/>
                                            </Trigger>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="false"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot" Value="#FFF0F0F0"/>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FFD9D9D9"/>
                                            </MultiDataTrigger>
                                            <MultiDataTrigger>
                                                <MultiDataTrigger.Conditions>
                                                    <Condition Binding="{Binding IsEnabled, RelativeSource={RelativeSource Self}}" Value="false"/>
                                                    <Condition Binding="{Binding IsEditable, RelativeSource={RelativeSource FindAncestor, AncestorLevel=1, AncestorType={x:Type ComboBox}}}" Value="true"/>
                                                </MultiDataTrigger.Conditions>
                                                <Setter Property="Background" TargetName="templateRoot" Value="White"/>
                                                <Setter Property="BorderBrush" TargetName="templateRoot" Value="#FFBFBFBF"/>
                                                <Setter Property="Background" TargetName="splitBorder" Value="Transparent"/>
                                                <Setter Property="BorderBrush" TargetName="splitBorder" Value="Transparent"/>
                                            </MultiDataTrigger>
                                        </ControlTemplate.Triggers>
                                    </ControlTemplate>
                                </Setter.Value>
                            </Setter>
                        </Style>

                    </ToggleButton.Style>

                </ToggleButton>
                <ContentPresenter x:Name="contentPresenter" ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" Content="{TemplateBinding SelectionBoxItem}" 
                        ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}" HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                        IsHitTestVisible="False" Margin="{TemplateBinding Padding}" SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                        VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>
            </Grid>
            <ControlTemplate.Triggers>
                <Trigger Property="HasDropShadow" SourceName="PART_Popup" Value="True">
                    <Setter Property="Margin" TargetName="shadow" Value="0,0,5,5"/>
                    <Setter Property="Color" TargetName="shadow" Value="#71000000"/>
                </Trigger>
                <Trigger Property="HasItems" Value="False">
                    <Setter Property="Height" TargetName="DropDownBorder" Value="95"/>
                </Trigger>
                <MultiTrigger>
                    <MultiTrigger.Conditions>
                        <Condition Property="IsGrouping" Value="True"/>
                        <Condition Property="VirtualizingPanel.IsVirtualizingWhenGrouping" Value="False"/>
                    </MultiTrigger.Conditions>
                    <Setter Property="ScrollViewer.CanContentScroll" Value="False"/>
                </MultiTrigger>
                <Trigger Property="CanContentScroll" SourceName="DropDownScrollViewer" Value="False">
                    <Setter Property="Canvas.Top" TargetName="OpaqueRect" Value="{Binding VerticalOffset, ElementName=DropDownScrollViewer}"/>
                    <Setter Property="Canvas.Left" TargetName="OpaqueRect" Value="{Binding HorizontalOffset, ElementName=DropDownScrollViewer}"/>
                </Trigger>

            </ControlTemplate.Triggers>

        </ControlTemplate>

        <!--#endregion-->

Upvotes: 1

Views: 131

Answers (1)

mm8
mm8

Reputation: 169170

Set the ContentTemplateSelector property of the ContentPresenter below the ToggleButton and it should work as expected:

<ContentPresenter x:Name="contentPresenter" 
                  ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}" 
                  Content="{TemplateBinding SelectionBoxItem}" 
                  ContentStringFormat="{TemplateBinding SelectionBoxItemStringFormat}"
                  ContentTemplateSelector="{TemplateBinding ItemsControl.ItemTemplateSelector}"
                  HorizontalAlignment="{TemplateBinding HorizontalContentAlignment}" 
                  IsHitTestVisible="False" Margin="{TemplateBinding Padding}"
                  SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}" 
                  VerticalAlignment="{TemplateBinding VerticalContentAlignment}"/>

Upvotes: 1

Related Questions