WPF bietet tolle Möglichkeiten Objekte direkt an graphische Elemente zu binden. So kann man beispielsweise eine Liste von Customer-Objekten als DataContext an eine ListView übergeben und muss sich sonst um nichts mehr kümmern.
Im folgenden Beispiel wird eine Liste von Customer-Objekten einer ListView übergeben:

Was wenn man nun gewisse Properties eines Objektes anders anzeigen möchte als es die ToString() Methode vorgibt, muss man diese entweder überschreiben oder dies auf eine andere (elegantere) Methode lösen.
Dazu bietet WPF ein Interface namens IValueConverter.
public interface IValueConverter
{
public object Convert( object value,
Type targetType,
object parameter,System.Globalization.CultureInfo culture);
public object ConvertBack(object value,
Type targetType,
object parameter, System.Globalization.CultureInfo culture);
}
Mit einer Klasse die dieses Interface implementiert kann man nun so ziemlich alles mit den Werten anstellen, was man möchte.
Man könnte das Geburtsdatum anstelle der DateTime Repräsentation auch als Base64-string anzeigen lassen.
Dazu erstellen wir folgenden Converter:
public class Base64Converter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return System.Convert.ToBase64String(Encoding.ASCII.GetBytes(value.ToString()));
}
public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return Encoding.ASCII.GetString(System.Convert.FromBase64String(value.ToString()));
}
#endregion
}
Dann fügen wir den Namespace unserem Window hinzu:
<Window x:Class="CustomValueConverter:WIndow1"
...
xmlns:converters="clr-namespace:CustomValueConverter.Converter">
Als nächstes erstellen wir unseren Converter in den Resourcen des Fensters:
...
<Window.Resources>
<converter:Base64Converter x:Key="base64"/>
</Window.Resources>
...
Und von nun an können wir den Converter überall dort wo wir DataBinding verwenden einsetzen. zum Beispiel:
...
<TextBlock Text="{Binding Path=Birthday,Converter={StaticResource base64}}"/>
...
was folgendes Ergebnis bringt:

An Klassen die IValueConverter implementieren kann man auch Parameter direkt aus XAML übergeben. Dies ist sehr hilfreich wenn man z.b. ein DateTime in einem eigenen Format darstellen will.
Dazu ändern wir die Convert()-Methode wie folgt:
public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
{
return ((DateTime)value).ToString((string)parameter);
}
Nun wird das DateTime nach dem string den wir als Parameter angeben formatiert.
In XAML werden die Parameter für den Converter wie folgt deklariert:
<TextBlock Text="{Binding Path=Birthday,
Converter={StaticResource parameterized},
ConverterParameter='dd@MM@yyyy'}"/>
was folgendes Ergebnis liefert:

Natürlich können ValueConverter beliebige Objekte in beliebige Repräsentationen umgewandelt werden. Eingeschränkt ist man hier nur durch den eigenen Einfallsreichtum.
Die ConvertBack()-Methode von IValueConverter dient dazu Werte aus der konvertierten Darstellung zurück in die Originalform zu bringen. Dies ist insbesondere dann notwendig wenn Properties auf TextBoxen oder ähnliche veränderbare Controls gebunden werden.