Transcendent
Transcendent

Reputation: 5755

WPF: multiple foreground colors in a ComboBox

In XAML we can set specific properties for each item in a ComboBox, for example:

<ComboBoxItem Foreground="Blue" Background="AntiqueWhite" Content="First Item"/>
<ComboBoxItem Foreground="Yellow" Background="Red" Content="Second Item"/>

When I try to do this when I'm dynamically filling a ComboBox from code, the ComboBox .Foreground property sets a foreground value on all the items. I would like to know if there's anyway to achieve this (setting different foreground colors for different items) in the code.

For example:

ComboBox1[First Item].Foreground = Brushes.Red;
ComboBox1[Second Item].Foreground = Brushes.Blue;

Upvotes: 3

Views: 2369

Answers (2)

har07
har07

Reputation: 89285

Try to cast ComboBox's Item to ComboBoxItem type, then set it's Foreground property instead of the whole ComboBox's Foreground :

((ComboBoxItem)ComboBox1.Items[0]).Foreground = Brushes.Red;

UPDATE :

if you add new item to ComboBox1 from code this way :

ComboBox1.Items.Add(new ComboBoxItem {Content = "Third Item"});

casting will work fine, because the code above resemble it's XAML counterpart you showed in question. But if you did it this way instead :

ComboBox1.Items.Add("Third Item");

casting won't work. Because that code added string to ComboBox Item instead of ComboBoxItem object. In this case getting ComboBoxItem is not as straightforward, you'll need to get it using ItemContainerGenerator as follow :

var comboBoxItem = (ComboBoxItem)ComboBox1.ItemContainerGenerator.ContainerFromItem(ComboBox1.Items[0]);
comboBoxItem.Foreground = Brushes.Red;

Upvotes: 4

Anatoliy Nikolaev
Anatoliy Nikolaev

Reputation: 22702

Try this:

XAML

<Grid>
    <ComboBox Name="TestComboBox"
              Width="100"
              Height="30"
              Loaded="TestComboBox_Loaded">

        <ComboBoxItem Content="First Item"/>            
        <ComboBoxItem Content="Second Item"/>
    </ComboBox>
</Grid>

Code-behind

private void TestComboBox_Loaded(object sender, RoutedEventArgs e)
{
    var comboBox = sender as ComboBox;

    if (comboBox != null) 
    {
        var firstItem = comboBox.Items[0] as ComboBoxItem;
        var secondItem = comboBox.Items[1] as ComboBoxItem;

        if (firstItem != null && secondItem != null)  
        {
            firstItem.Foreground = Brushes.Red;
            secondItem.Foreground = Brushes.Blue;
        }
    }
}

Upvotes: 1

Related Questions