21

I am using MVVM light with WPF. I want to set button background color based on some specific condition through ViewModel. Kindly suggest some way to get it. Thanks

Yogesh
  • 789
  • 2
  • 7
  • 20

2 Answers2

33

You could bind the control's Background to a property on the viewmodel, the trick is to use an IValueConverter to return a Brush with the color you require. Here's an example that converts a boolean value from the viewmodel to a color:

public class BoolToBrushConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value == null)
            return Brushes.Transparent;

        return Convert.ToBoolean(value)
            ? Brushes.Red
            : Brushes.Transparent; 
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        throw new NotImplementedException();
    }
}

with a binding expression like

"{Binding Reviewed, Converter={StaticResource BoolToBrushConverter}}"

where Reviewed is your boolean viewmodel property.

Ian Kemp
  • 26,561
  • 17
  • 107
  • 129
almog.ori
  • 7,749
  • 1
  • 34
  • 48
29

Using triggers:

<Button>
    <Button.Style>
        <Style TargetType="Button">
            <!-- Set the default value here (if any). 
                 If you set it directly on the button that will override the trigger. -->
            <Setter Property="Background" Value="LightGreen" />
            <Style.Triggers>
                <DataTrigger Binding="{Binding SomeConditionalProperty}"
                             Value="True">
                    <Setter Property="Background" Value="Pink" />
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </Button.Style>
</Button>

Explanation of the comment.


Using a dependent property in a view model (MVVM):

public bool SomeConditionalProperty 
{
    get { /*...*/ }
    set
    {
        //...

        OnPropertyChanged(nameof(SomeConditionalProperty));
        //Because Background is dependent on this property.
        OnPropertyChanged(nameof(Background));
    }
}

public Brush Background =>
    SomeConditionalProperty ? Brushes.Pink : Brushes.LightGreen;

Then you just bind to Background.

Ian Kemp
  • 26,561
  • 17
  • 107
  • 129
H.B.
  • 142,212
  • 27
  • 297
  • 366
  • This is a really nice way to do this when using wpf, if you looking for code that can port to silverlight you may also require the expression SDK for the trigger symantics though – almog.ori Sep 09 '11 at 20:11