With WPF, it’s pretty easy to create a converter to display the color of a text depending on an Enum value. Here is a simple example with IValueConverter.
Let’s start with the View:
<Window x:Class="TextBlockConverter.Views.MainWindow"
xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
xmlns:prism="http://prismlibrary.com/"
xmlns:converters="clr-namespace:TextBlockConverter.Converters"
prism:ViewModelLocator.AutoWireViewModel="True"
Title="{Binding Title}" Height="200" Width="200">
<Window.Resources>
<converters:StatusToColorConverter x:Key="StatusToColorConverter"/>
</Window.Resources>
<Grid>
<StackPanel Margin="65">
<TextBlock
Text="{Binding StatusOk}"
Foreground="{Binding StatusOk, Converter={StaticResource StatusToColorConverter}}"/>
<TextBlock
Text="{Binding StatusNOk}"
Foreground="{Binding StatusNOk, Converter={StaticResource StatusToColorConverter}}"/>
</StackPanel>
</Grid>
</Window>
Code language: HTML, XML (xml)
As you can see, we use a converter to select the correct color. Here is the code for this converter:
using System;
using System.Globalization;
using System.Windows.Data;
using System.Windows.Media;
using TextBlockConverter.Models;
namespace TextBlockConverter.Converters
{
public class StatusToColorConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is StatusEnum && value != null)
{
StatusEnum status = (StatusEnum)value;
var color = new SolidColorBrush(Colors.White);
switch (status)
{
case StatusEnum.Ok:
color = new SolidColorBrush(Colors.Green);
break;
case StatusEnum.NOk:
color = new SolidColorBrush(Colors.Red);
break;
default:
color = new SolidColorBrush(Colors.White);
break;
}
return color;
}
return Binding.DoNothing;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
throw new NotSupportedException();
}
}
}
Code language: C# (cs)
The color will be based on the Status Enum:
namespace TextBlockConverter.Models
{
public enum StatusEnum
{
Ok = 1,
NOk = 2
}
}
Code language: C# (cs)
And of course our simple ViewModel:
using Prism.Mvvm;
using TextBlockConverter.Models;
namespace TextBlockConverter.ViewModels
{
public class MainWindowViewModel : BindableBase
{
private string _title = "TextBlock Enum Converter";
public string Title
{
get { return _title; }
set { SetProperty(ref _title, value); }
}
private StatusEnum _statusOk;
public StatusEnum StatusOk
{
get { return _statusOk; }
set { SetProperty(ref _statusOk, value); }
}
private StatusEnum _statusNOk;
public StatusEnum StatusNOk
{
get { return _statusNOk; }
set { SetProperty(ref _statusNOk, value); }
}
public MainWindowViewModel()
{
StatusOk = StatusEnum.Ok;
StatusNOk = StatusEnum.NOk;
}
}
}
Code language: C# (cs)
Happy coding 🙂