Dinamically Change the Background Color of ComboBox When Color Selected from Item List in WPF MVVM

Introduction

This blog introduce how to change the background color of ComboBox Control in WPF, When its itm selected from items list.

To changed the background color of Combobox I have declared a class name mycolor that has two properties(Name and Color), the color property contains solid color of brush and declared a list(MyColors) in the view modelwhose datatype is mycolor.

I have binded the list(MyColors) with combobox, Again a property named ComboBoxBackColor declared to binded it with background property of ComboBox. In the SelectionChanged Command of ComboBox I am changing the background color of Combobox.

See the Bellow code fore more clarification:

XAML CODE

<window x:class="PrintingRichTextBoxContent.MainWindow" xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"

   xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml" xmlns:i="clr-namespace:System.Windows.Interactivity;assembly=System.Windows.Interactivity"

   title="MainWindow" height="755" width="702" initialized="Window_Initialized_1">

<Grid HorizontalAlignment="Left" Height="725" VerticalAlignment="Top" Width="694">

   <ComboBox HorizontalAlignment="Left" x:Name="cmbColor" Margin="11,695,0,0" VerticalAlignment="Top" Width="216" ItemsSource="{Binding MyColors}" DisplayMemberPath="Name" SelectedValuePath="Color" Background="{Binding      Path=ComboBoxBackColor, Mode=TwoWay, UpdateSourceTrigger=PropertyChanged}">

   <i:Interaction.Triggers> <i:EventTrigger EventName="SelectionChanged">

     <i:InvokeCommandAction Command="{Binding ColorChangeCommand}" CommandParameter="{Binding ElementName=cmbColor, Path=SelectedItem}"/>

   </i:EventTrigger>

  </i:Interaction.Triggers>

 </ComboBox>

</Grid>

</window>

View Model Code
 

using System;

using System.Collections.Generic;

using System.Linq;

using System.Text;

using System.Threading.Tasks;

using Microsoft.Practices.Prism.Commands;

using System.Windows.Controls;

using System.ComponentModel;

using System.Printing;

using System.Windows.Documents;

using System.Windows.Media;

 

namespace PrintingRichTextBoxContent

{

    public class MainWindowViewModel : INotifyPropertyChanged

    {

        public DelegateCommand<object> ColorChangeCommand { get; set; }

        public List<MyColors> MyColors { get; set; }

        public Brush _ComboBoxBackColor;

        public Brush ComboBoxBackColor

        {

            get

            {

                return _ComboBoxBackColor;

            }

            set

            {

                _ComboBoxBackColor = value;

                OnPropertyChanged("ComboBoxBackColor");

            }

        }

        public MainWindowViewModel()

        {

            this.MyColors = new List<MyColors>();

            this.SetColors();

            this.ComboBoxBackColor = Brushes.White;

            this.ColorChangeCommand = new DelegateCommand<object>(ColorChangeCommand_Excute);

        }

        private void ColorChangeCommand_Excute(object arg)

        {

            this.ComboBoxBackColor = ((MyColors)arg).Color;

        }

        private void SetColors()

        {

            this.MyColors.Add(new MyColors() { Name = "Aqua", Color = Brushes.Aqua });

            this.MyColors.Add(new MyColors() { Name = "Black", Color = Brushes.Black });

            this.MyColors.Add(new MyColors() { Name = "Cyan", Color = Brushes.Cyan });

            this.MyColors.Add(new MyColors() { Name = "Blue", Color = Brushes.Blue });

            this.MyColors.Add(new MyColors() { Name = "Gray", Color = Brushes.Gray });

            this.MyColors.Add(new MyColors() { Name = "DarkBlue", Color = Brushes.DarkBlue });

            this.MyColors.Add(new MyColors() { Name = "FloralWhite", Color = Brushes.FloralWhite });

        }

 

        bool _IsDirty = false;

        public event PropertyChangedEventHandler PropertyChanged;

        public virtual bool IsDirty

        {

            get { return _IsDirty; }

            set

            {

                _IsDirty = value;

                OnPropertyChanged("IsDirty", false);

            }

        }

        protected virtual void OnPropertyChanged(string propertyName)

        {

            OnPropertyChanged(propertyName, true);

        }

        protected virtual void OnPropertyChanged(string propertyName, bool dirty)

        {

            if (dirty)

            {

                _IsDirty = true;

                OnPropertyChanged("IsDirty", false);

            }

            if (this.PropertyChanged != null)

                this.PropertyChanged(this, new PropertyChangedEventArgs(propertyName));

        }

    }

    public class MyColors

    {

        public string Name { get; set; }

        public Brush Color { get; set; }

    }

}