8
votes

I've got a problem with setting the HighlightBrushKey of a SelectedItem of a Listbox in WPF. My intention was to set the color of an Item depending on a given Boolean value, lying in code.

I've tried following steps:

  • Implementing a Converter, checking the boolean and returning the right color.

    Example:

    <ribbon:RibbonWindow.Resources>
      <l:WindowControl x:Key="ListBoxItemBackgroundConverter" />
        <Style x:Key="listBoxStyle" TargetType="{x:Type ListBoxItem}">
          <Style.Resources>
            <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="{Binding Source={x:Static SystemColors.HighlightBrushKey}, Converter={StaticResource ListBoxItemBackgroundConverter}}"/>
            <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="{Binding Source={x:Static SystemColors.ControlBrushKey}, Converter={StaticResource ListBoxItemBackgroundConverter}}"/>
          </Style.Resources>
        </Style>
    </ribbon:RibbonWindow.Resources>
    

    The problem here was that the Convert method was called only once, but I need the Converter to be called every time I select an item and checking the Boolean. Like a Trigger, but with the "HighlightBrushKey".

    Converter:

    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
       if(currentField == null)
          return Brushes.Yellow;
       if (currentField.Save)
          return Brushes.LightGreen;
       else
          return Brushes.Yellow;
    }
    
  • My next idea was setting "HighlightBrushKey" to "Transparent" and changing the item.Background manually in code. The Problem here was that my items became white and the Background Color could not be seen

    Example:

    <ListBox.Resources>
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Transparent" />
        <SolidColorBrush x:Key="{x:Static SystemColors.HighlightTextBrushKey}" Color="Black" />
        <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Transparent" />
    </ListBox.Resources>
    

Thanks in Advance! :)

2
Nice first question Andy, well constructed with precise examples of exactly what you were trying to highlight! +1Lloyd Powell
@Andy What is currentField1 in your converter? How are you getting this in Converter? Can you try binding to currentField (i.e. YourViewModelProperty) in the style invisible provided.akjoshi
currentField is an object. Class name is Field and is has a Boolean Property named "Save". how can i bind to it in XAML?Andy
Sounds like you need a multivalueconverter which checks IsSelected and your boolpatrick

2 Answers

1
votes
<Style x:Key="listBoxStyle" TargetType="{x:Type ListBox}">
    <Style.Resources>
         <!-- Background of selected item when focussed -->
         <SolidColorBrush x:Key="{x:Static SystemColors.HighlightBrushKey}" Color="Red" />
         <!-- Background of selected item when not focussed -->
         <SolidColorBrush x:Key="{x:Static SystemColors.ControlBrushKey}" Color="Green" />
    </Style.Resources>
</Style>

<ListBox Style="{StaticResource listBoxStyle}">
</ListBox> 
0
votes

If you wish to disable the highlighting when a listboxitem is selected or mouse over, you can use the below code.

<Style TargetType="ListBoxItem" x:Key="ListBoxItemStyle">
    <Setter Property="IsSelected" Value="{Binding Content.IsSelected, Mode=TwoWay, RelativeSource={RelativeSource Self}}"/>
    <Setter Property="Template">
        <Setter.Value>
            <ControlTemplate TargetType="ListBoxItem">
                <ContentPresenter/>
            </ControlTemplate>
        </Setter.Value>
    </Setter>
</Style>

<ListBox ItemContainerStyle="{StaticResource ListBoxItemStyle}"/>