Durch das System von Data Binding kann man ganz einfach seine Properties aus den ViewModels an die View binden. Manchmal liegen die Daten aber nicht im gewünschten Format vor und daher kann man ganz einfach Converter schreiben, welche die Daten von Typ A in Typ B umwandelt. Dies ist nun der erste Teil, wo ich ein paar einfache Converter teilen möchte, welche meist in allen meinen App-Projekten zu finden sind. Die Syntax ist hierbei für Xamarin.Forms Apps, sollte aber leicht für UWP oder auch WPF angepasst werden können.
Jeder Converter muss das Interface IValueConverter
implementieren und damit die Methoden Convert
und ConvertBack
. In den meisten Fällen möchte man die Daten aus dem ViewModel für die View anpassen und daher reicht es aus nur die Convert
-Methode zu implementieren.
Beginnen möchte ich mit dem Standard-Converter, den InverseBoolConverter
. Wie der Name bereits vermuten lässt, wird hier ein Bool-Wert einfach umgekehrt. Dies ist zum Beispiel interessant, wenn man während eines Ladevorgangs Eingabefelder deaktivieren möchte.
public class InverseBoolConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
return !((bool)value);
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Auch der nächste Converter sollte in keiner App fehlen, der NullToIsVisibleConverter
. Hier wird geschaut, ob der übergebene Wert null ist oder eben nicht. Dabei wird hier auch über dem Parameter die Logik umgekehrt, sofern dieser übergeben wird.
public class NullToIsVisibleConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (value is string valueAsString)
{
if (parameter != null)
return !string.IsNullOrWhiteSpace(valueAsString);
return string.IsNullOrWhiteSpace(valueAsString);
}
if (parameter != null)
return value != null;
return value == null;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Ein weiterer nützlicher Converter ist der StringCaseConverter
. Es kommt immer mal wieder, dass Designer einen Text nur in Groß- oder Kleinbuchstaben dargestellt haben wollen. Ich habe einen Converter geschrieben, welcher über den Parameter
steuert, wie der String ausgegeben werde soll. Dabei werden LowerCase
, UpperCase
und TitleCase
unterstützt.
public class StringCaseConverter : IValueConverter
{
public object Convert(object value, Type targetType,
object parameter, CultureInfo culture)
{
if (parameter is string parameterAsString && value is string valueAsString)
{
switch (parameterAsString.ToLower())
{
case "l":
return valueAsString.ToLower();
case "t":
var textInfo = CultureInfo.CurrentCulture.TextInfo;
return textInfo.ToTitleCase(valueAsString);
case "u":
return valueAsString.ToUpper();
}
}
return value;
}
public object ConvertBack(object value, Type targetType,
object parameter, CultureInfo culture)
{
throw new NotImplementedException();
}
}
Dies ist der erste Teil meiner kleinen Converter-Sammlung. Aber keine Angst ich habe noch zahlreiche weitere nützliche Converter zur Hand und werde in regelmäßigen Abständen immer mal wieder ein paar davon in meinem Blog vorstellen. Solltet ihr aber auch noch weitere Converter in fast allen euren Projekten verwenden, könnt ihr mir diese gerne in die Kommentare schreiben.