0
votes

I have a combobox that uses a style to allow multiple selection using a listbox (full style at bottom of question, if needed). The Control is bound to an ObservableCollection<Foo>; Foo looks a bit like this:

public class Foo
{
    ComplexOtherClass Complex { get; set; }
    string Label { get; set; }
}

The binding on the listbox within the style looks like this:

<....
    <ListBox x:Name="lstBox"
        ItemsSource="{TemplateBinding ItemsSource}"
        DisplayMemberPath="Label">            
    </ListBox>
..../>

That gives me a nice collection of string Labels that are shown correctly. The problem is that the controltemplate at the top of the combobox does not "know" to display the label of each of the SelectedItems, so it just shows the Namespace and class of each item that is selected.

<ItemsControl x:Name="showMe" 
              ItemsSource="{Binding SelectedItems, ElementName=lstBox}">        
</ItemsControl>

How can I change the style so that the ItemsControl shows the Label property of the selected items?

I have not found anything on Google to help me here - any search involving the multiple select combobox seems to just show how to make one, without addressing this specific problem!

Here's the full style (sorry about all the static resources, but hopefully the structure still makes enough sense to be useful)

<ResourceDictionary xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
                    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml">
    <ResourceDictionary.MergedDictionaries>
        <ResourceDictionary Source="Brushes_Colours_rsrc.xaml"/>
    </ResourceDictionary.MergedDictionaries>
    <ControlTemplate x:Key="ComboBoxToggleButton" TargetType="{x:Type ToggleButton}">
        <Grid>
            <Grid.ColumnDefinitions>
                <ColumnDefinition />
                <ColumnDefinition Width="20" />
            </Grid.ColumnDefinitions>
            <VisualStateManager.VisualStateGroups>
                <VisualStateGroup x:Name="CommonStates">
                    <VisualState x:Name="Normal" />
                    <VisualState x:Name="MouseOver">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                          Storyboard.TargetName="Border">
                                <EasingColorKeyFrame KeyTime="0"
                                   Value="{StaticResource ControlMouseOverColor}" />
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Pressed" />
                    <VisualState x:Name="Disabled">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                          Storyboard.TargetName="Border">
                                <EasingColorKeyFrame KeyTime="0"
                                   Value="{StaticResource GlyphColor}" />
                            </ColorAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Shape.Fill).(SolidColorBrush.Color)"
                                          Storyboard.TargetName="Arrow">
                                <EasingColorKeyFrame KeyTime="0"
                                   Value="{StaticResource DisabledForegroundColor}" />
                            </ColorAnimationUsingKeyFrames>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Border.BorderBrush).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                          Storyboard.TargetName="Border">
                                <EasingColorKeyFrame KeyTime="0"
                                   Value="{StaticResource DisabledBorderDarkColor}" />
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                </VisualStateGroup>
                <VisualStateGroup x:Name="CheckStates">
                    <VisualState x:Name="Checked">
                        <Storyboard>
                            <ColorAnimationUsingKeyFrames Storyboard.TargetProperty="(Panel.Background).(GradientBrush.GradientStops)[1].(GradientStop.Color)"
                                          Storyboard.TargetName="Border">
                                <EasingColorKeyFrame KeyTime="0"
                                   Value="{StaticResource ControlPressedColor}" />
                            </ColorAnimationUsingKeyFrames>
                        </Storyboard>
                    </VisualState>
                    <VisualState x:Name="Unchecked" />
                    <VisualState x:Name="Indeterminate" />
                </VisualStateGroup>
            </VisualStateManager.VisualStateGroups>
            <Border x:Name="Border"
            Grid.ColumnSpan="2"
            CornerRadius="2"
            BorderThickness="1">
                <Border.BorderBrush>
                    <LinearGradientBrush EndPoint="0,1"
                             StartPoint="0,0">
                        <GradientStop Color="{DynamicResource BorderLightColor}"
                        Offset="0" />
                        <GradientStop Color="{DynamicResource BorderDarkColor}"
                        Offset="1" />
                    </LinearGradientBrush>
                </Border.BorderBrush>
                <Border.Background>

                    <LinearGradientBrush StartPoint="0,0"
                             EndPoint="0,1">
                        <!--button fill-->
                        <LinearGradientBrush.GradientStops>
                            <GradientStopCollection>
                                <GradientStop Color="{DynamicResource ControlLightColor}" />
                                <GradientStop Color="{DynamicResource ControlMediumColor}"
                            Offset="1.0" />
                            </GradientStopCollection>
                        </LinearGradientBrush.GradientStops>
                    </LinearGradientBrush>

                </Border.Background>
            </Border>
            <Border Grid.Column="0"
            CornerRadius="2,0,0,2"
            Margin="1" >
                <Border.Background>
                    <SolidColorBrush Color="{DynamicResource ControlLightColor}"/>
                </Border.Background>
            </Border>
            <Path x:Name="Arrow"
          Grid.Column="1"
          HorizontalAlignment="Center"
          VerticalAlignment="Center"
          Data="M 0 0 L 4 4 L 8 0 Z" >
                <Path.Fill>
                    <SolidColorBrush Color="Green"/>
                </Path.Fill>
            </Path>
        </Grid>
    </ControlTemplate>
    <ControlTemplate x:Key="ComboBoxTextBox"
                 TargetType="{x:Type TextBox}">
        <Border x:Name="PART_ContentHost"
          Focusable="False"
          Background="Green" />
    </ControlTemplate>
    <Style x:Key="MyMultiComboBox" TargetType="{x:Type ComboBox}">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="ScrollViewer.HorizontalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.VerticalScrollBarVisibility" Value="Auto" />
        <Setter Property="ScrollViewer.CanContentScroll" Value="true" />
        <Setter Property="MinWidth" Value="120" />
        <Setter Property="MinHeight" Value="20" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ComboBox}">
                    <Grid>
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="CommonStates">
                                <VisualState x:Name="Normal" />
                                <VisualState x:Name="MouseOver" />
                                <VisualState x:Name="Disabled">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="PART_EditableTextBox"
                                                Storyboard.TargetProperty="(TextElement.Foreground).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="{StaticResource DisabledForegroundColor}" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                            <VisualStateGroup x:Name="EditStates">
                                <VisualState x:Name="Editable">
                                    <Storyboard>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="PART_EditableTextBox">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Visible}" />
                                        </ObjectAnimationUsingKeyFrames>
                                        <ObjectAnimationUsingKeyFrames Storyboard.TargetProperty="(UIElement.Visibility)" Storyboard.TargetName="ContentSite">
                                            <DiscreteObjectKeyFrame KeyTime="0" Value="{x:Static Visibility.Hidden}" />
                                        </ObjectAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="Uneditable" />
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ToggleButton x:Name="ToggleButton"
                                              Template="{StaticResource ComboBoxToggleButton}"
                                              Grid.Column="2"
                                              Focusable="false"
                                              ClickMode="Press"
                                              IsChecked="{Binding IsDropDownOpen, Mode=TwoWay, RelativeSource={RelativeSource TemplatedParent}}"/>
                        <ItemsControl x:Name="showMe" IsHitTestVisible="false" Style="{StaticResource Text_NormalText}" ItemsSource="{Binding SelectedItems, ElementName=lstBox}" Margin="1,0,22,0">
                            <ItemsControl.ItemsPanel>
                                <ItemsPanelTemplate>
                                    <StackPanel IsItemsHost="True" Orientation="Horizontal"/>
                                </ItemsPanelTemplate>
                            </ItemsControl.ItemsPanel>
                        </ItemsControl>
                        <ContentPresenter x:Name="ContentSite"
                                          IsHitTestVisible="False"
                                          Content="{TemplateBinding SelectionBoxItem}"
                                          ContentTemplate="{TemplateBinding SelectionBoxItemTemplate}"
                                          ContentTemplateSelector="{TemplateBinding ItemTemplateSelector}"
                                          Margin="3,3,23,3"
                                          VerticalAlignment="Stretch"
                                          HorizontalAlignment="Left">
                        </ContentPresenter>
                        <TextBox x:Name="PART_EditableTextBox"
                                 Style="{x:Null}"
                                 Template="{StaticResource ComboBoxTextBox}"
                                 HorizontalAlignment="Left"
                                 VerticalAlignment="Bottom"
                                 Margin="3,3,23,3"
                                 Focusable="True"
                                 Background="Transparent"
                                 Visibility="Hidden"
                                 IsReadOnly="{TemplateBinding IsReadOnly}" />
                        <Popup x:Name="Popup"
                                       Placement="Bottom"
                                       IsOpen="{TemplateBinding IsDropDownOpen}"
                                       AllowsTransparency="True"
                                       Focusable="False"
                                       PopupAnimation="Slide">
                            <Grid x:Name="DropDown"
                                          SnapsToDevicePixels="True"
                                          MinWidth="{TemplateBinding ActualWidth}"
                                          MaxHeight="{TemplateBinding MaxDropDownHeight}">
                                <Border x:Name="DropDownBorder" BorderThickness="1">
                                    <Border.BorderBrush>
                                        <SolidColorBrush Color="{DynamicResource BorderMediumColor}" />
                                    </Border.BorderBrush>
                                    <Border.Background>
                                        <SolidColorBrush Color="{DynamicResource ControlLightColor}" />
                                    </Border.Background>
                                </Border>
                                <ScrollViewer Margin="4,6,4,6" SnapsToDevicePixels="True">
                                    <!--<StackPanel IsItemsHost="True" KeyboardNavigation.DirectionalNavigation="Contained" />-->
                                    <ListBox x:Name="lstBox"
                                             Background="{StaticResource DarkGreenBackground}"
                                             Style="{StaticResource Text_NormalText}"
                                             TextBlock.FontSize="12"
                                             SnapsToDevicePixels="{TemplateBinding SnapsToDevicePixels}"
                                             KeyboardNavigation.DirectionalNavigation="Contained" SelectionMode="Multiple"
                                             ItemsSource="{TemplateBinding ItemsSource}"
                                             DisplayMemberPath="Label"
                                             >
                                    </ListBox>
                                </ScrollViewer>
                            </Grid>
                        </Popup>
                    </Grid>
                    <ControlTemplate.Triggers>
                        <Trigger Property="HasItems" Value="false">
                            <Setter TargetName="DropDownBorder" Property="MinHeight" Value="95" />
                        </Trigger>
                        <Trigger Property="IsGrouping" Value="true">
                            <Setter Property="ScrollViewer.CanContentScroll" Value="false" />
                        </Trigger>
                        <Trigger SourceName="Popup" Property="AllowsTransparency" Value="true">
                            <Setter TargetName="DropDownBorder" Property="CornerRadius" Value="4" />
                            <Setter TargetName="DropDownBorder" Property="Margin" Value="0,2,0,0" />
                        </Trigger>
                    </ControlTemplate.Triggers>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
    <Style x:Key="{x:Type ComboBoxItem}" TargetType="{x:Type ComboBoxItem}">
        <Setter Property="SnapsToDevicePixels" Value="true" />
        <Setter Property="OverridesDefaultStyle" Value="true" />
        <Setter Property="Template">
            <Setter.Value>
                <ControlTemplate TargetType="{x:Type ComboBoxItem}">
                    <Border x:Name="Border"
                                    Padding="2"
                                    SnapsToDevicePixels="true"
                                    Background="Transparent">
                        <VisualStateManager.VisualStateGroups>
                            <VisualStateGroup x:Name="SelectionStates">
                                <VisualState x:Name="Unselected" />
                                <VisualState x:Name="Selected">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="{StaticResource Good}" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                                <VisualState x:Name="SelectedUnfocused">
                                    <Storyboard>
                                        <ColorAnimationUsingKeyFrames Storyboard.TargetName="Border" Storyboard.TargetProperty="(Panel.Background).(SolidColorBrush.Color)">
                                            <EasingColorKeyFrame KeyTime="0" Value="{StaticResource SelectedUnfocusedColor}" />
                                        </ColorAnimationUsingKeyFrames>
                                    </Storyboard>
                                </VisualState>
                            </VisualStateGroup>
                        </VisualStateManager.VisualStateGroups>
                        <ContentPresenter />
                    </Border>
                </ControlTemplate>
            </Setter.Value>
        </Setter>
    </Style>
</ResourceDictionary>

EDIT Failed attempt to bind a textblock instead of an ItemsControl - nothing is shown in the textblock.

<Style.Resources>
    <base:CollectionToStringConverter x:Key="ToList"/>
</Style.Resources>

...and...

<....
<TextBlock x:Name="showMe" IsHitTestVisible="False"
           TextTrimming="CharacterEllipsis"
           Background="HotPink" Foreground="Black"
           DataContext="{Binding SelectedItems,ElementName=lstBox}"
           Text="{Binding SelectedItem.Label,Converter={StaticResource ToList}}"
           Margin="1,1,22,1">
</TextBlock>
....>
1
Should be Text="{Binding SelectedItems, ElementName=lstBox, Converter={StaticResource ToList}}" and remove DataContext. The converter should return a string concatenation of all labels.Novitchi S

1 Answers

1
votes

You used DisplayMemberPath property for the ListBox why not do the same for the selection box?

<ItemsControl x:Name="showMe" 
              ItemsSource="{Binding SelectedItems, ElementName=lstBox}"
              DisplayMemberPath="Label">        
</ItemsControl>

But actually you don't need an ItemsControl there, maybe a simple TextBlock with a FooListToLabels Value Converter?