Dienstag, 8. Juli 2014

XAML Formatieren von Bindings mit IValueConverter Interface


In vielen Fällen kommt es vor das, dass Format was man von einer Datenquelle erhält, nicht der passende Formatierung für den Anzeigezweck entspricht. Man kann natürlich die Datenquelle anpassen oder die ToString()Methoden Überschreibt. Aber die kann man auch eleganter über einen Konverter erreichen.

Um einen Konverter für eine Type zu erstellen kann man sich des Interfaces IValueConverter bedienen.

Diese Interface bedingt die Methode Convert und ConvertBack und können im XAML beim Binding der Datenquelle wie folgt verwendet werden.

< UserControl.Resources>
       <Converter:DateTimeConverter x:Key="DateTimeConverter" />
</UserControl.Resources>

<GridViewColumn
EntryDateMember ="{Binding Path=EntryDate, Converter={StaticResource DateTimeConverter}}" />
Die zugehörige C# Klasse kann mit folgendem Listing verwendet werden.
public class DateTimeConverter : IValueConverter
{
     public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        if (value != null)
        {
            return ((DateTime)value).ToString("dd.MM.yyyy");
        }
        else
        {
            return String.Empty
        }

    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
   {
      return DateTime.Parse(value.ToString());
   }
}



Im diesem Beispiel wird das Entrittsdatum im Format “dd.MM.yyyy” zurückgegen. Man kann diese Konverter Klassen auf Bedingungsprüfungen verwenden, um Beispielsweise die Darstellung des Textes zu verändern über Abhängigkeiten der Datenquelle.
Im Beispiel wird die Schriftdicke durch einen Booleschen Wert bestimmt.

public class BooleanToFontWieghtConverter
             : IValueConverter
{
        public object Convert(object value, Type targetType, object parameter, string language)
        {
            string ret = "Normal";
            if((bool)value)
            {
                ret = "ExtraBold";
            }
            return ret;
         }

       public object ConvertBack(object value, Type targetType, object parameter, string language)
      {
            return value.ToString().Equals("ExtraBold");
      }
}

Für weiter Informationen siehe MSDN IValueConverter-Schnittstelle

Keine Kommentare:

Kommentar veröffentlichen