Durch die IValueConverter-Schnittstelle kann eine benutzerdefinierte Logik für eine Datenbindung eingerichtet werden. In diesem Post werden 8 nützliche Umsetzungen dieser Schnittstelle vorgestellt. Diese Implementierungen der Schnittstelle können in Windows Store Apps und Windows Phone Apps, die auf der Windows Runtime basieren, genutzt werden.

1. BooleanToVisibilityConverter

Der Klassiker unter den Wertkonvertern, der aus einem booleschen Wert einen Sichtbarkeitswert für Steuerelemente macht. Bei dieser Version kann ein Konverter-Parameter angegeben werden, der den Sichtbarkeitswert nach Wunsch umkehrt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is bool)
        {
            var booleanValue = (bool)value;

            if (parameter != null)
            {
                booleanValue = !booleanValue;
            }

            if (booleanValue)
            {
                return Windows.UI.Xaml.Visibility.Visible;
            }
        }

        return Windows.UI.Xaml.Visibility.Collapsed;
    }

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

Verwendung in XAML:

1
2
3
4
<TextBlock Text="Es ist ein Fehler aufgetreten..."
           Visibility="{Binding DisplayError, Converter={StaticResource BooleanToVisibilityConverter}}"/>
<TextBlock Text="Alles läuft erwartungsgemäß"
           Visibility="{Binding DisplayError, Converter={StaticResource BooleanToVisibilityConverter}, ConverterParameter=1}"/>

2. StringToVisibilityConverter

Macht aus einer Zeichenfolge einen Sichtbarkeitswert. Wenn die Zeichenfolge einen Inhalt hat, wird Visible zurückgegeben. Auch hier kann wieder ein beliebiger Parameter angegeben werden, der die Sichtbarkeit umkehrt.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class StringToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value != null)
        {
            bool visible = !string.IsNullOrWhiteSpace(value.ToString());

            if (parameter != null)
            {
                visible = !visible;
            }

            if (visible)
            {
                return Windows.UI.Xaml.Visibility.Visible;
            }
        }

        return Windows.UI.Xaml.Visibility.Collapsed;
    }

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

Verwendung in XAML:

1
2
<TextBlock Text="{Binding MyString}"
           Visibility="{Binding MyString, Converter={StaticResource StringToVisibilityConverter}}"/>

3. CollectionToVisibilityConverter

Mithilfe dieses Wertkonverters kann ein Steuerelement ein-/ oder ausgeblendet werden, je nachdem ob eine Liste Elemente beeinhaltet oder nicht. Dadurch kann beispielsweise ein Hinweistext angezeigt werden, dass keine Elemente vorhanden sind.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
public class CollectionToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is ICollection)
        {
            bool visible = ((ICollection)value).Count > 0;

            if (parameter != null)
            {
                visible = !visible;
            }

            if (visible)
            {
                return Windows.UI.Xaml.Visibility.Visible;
            }
        }

        return Windows.UI.Xaml.Visibility.Collapsed;
    }

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

Verwendung in XAML:

1
2
3
4
5
6
7
8
9
10
<ItemsControl ItemsSource="{Binding StringList}" Visibility="{Binding StringList, Converter={StaticResource CollectionToVisibilityConverter}}">
  <ItemsControl.ItemTemplate>
    <DataTemplate>
      <TextBlock Text="{Binding}"/>
    </DataTemplate>
  </ItemsControl.ItemTemplate>
</ItemsControl>

<TextBlock Text="Es sind keine Elemente vorhanden"
           Visibility="{Binding StringList, Converter={StaticResource CollectionToVisibilityConverter}, ConverterParameter=1}"/>

4. DateTimeToStringConverter

Wandelt einen DateTime-Wert in eine Zeichenfolge um, unter Angabe eines beliebigen Formats.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
public class DateTimeToStringConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is DateTime)
        {
            var dateTime = (DateTime)value;

            string formatString = parameter as string;

            if (!string.IsNullOrEmpty(formatString))
            {
                if (!string.IsNullOrEmpty(language))
                {
                    return dateTime.ToString(formatString, new CultureInfo(language));
                }
                else
                {
                    return dateTime.ToString(formatString);
                }
            }
            else
            {
                return dateTime.ToString("dd.MM.yyyy");
            }
        }

        return string.Empty;
    }

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

Verwendung in XAML:

1
2
3
<TextBlock Text="{Binding DateTime1, Converter={StaticResource DateTimeToStringConverter}}"/>
<TextBlock Text="{Binding DateTime2, Converter={StaticResource DateTimeToStringConverter}, ConverterParameter='dd.MM.yyyy HH:mm:ss'}"/>
<TextBlock Text="{Binding DateTime3, Converter={StaticResource DateTimeToStringConverter}, ConverterParameter='MM/dd/yyyy HH:mm'}"/>

5. DateTimeCompactConverter

Macht aus einem DateTime eine kompakte Zeichenfolge, wie sie auch auf dem Windows Phone verwendet wird. Liegt der DateTime-Wert auf dem heutigen Tag, wird die Uhrzeit angezeigt. Liegt er in der aktuellen Woche, wird der Wochentag angezeigt. Je nach Zeitabstand kommt dann noch das Datum oder Jahr hinzu. Bei Angabe eines beliebigen Parameters werden mehr Informationen ausgegeben.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
public class DateTimeCompactConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is DateTime)
        {
            var dateTime = (DateTime)value;
            var timeSpan = DateTime.Now - dateTime;

            if (dateTime.Date == DateTime.Today)
            {
                return dateTime.ToString("HH:mm");
            }
            else if (timeSpan.TotalDays < 7)
            {
                if (parameter == null)
                {
                    return dateTime.ToString("ddd");
                }
                else
                {
                    return dateTime.ToString("ddd, HH:mm");
                }
            }
            else if (dateTime.Year == DateTime.Now.Year)
            {
                if (parameter == null)
                {
                    return dateTime.ToString("dd.MM");
                }
                else
                {
                    return dateTime.ToString("dd.MM, HH:mm");
                }
            }
            else
            {
                if (parameter == null)
                {
                    return dateTime.ToString("dd.MM.yyyy");
                }
                else
                {
                    return dateTime.ToString("dd.MM.yyyy, HH:mm");
                }
            }
        }

        return string.Empty;
    }

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

Verwendung in XAML:

1
<TextBlock Text="{Binding DateTime1, Converter={StaticResource DateTimeCompactConverter}}"/>

6. ObjectToStringFormatConverter

Wandelt ein Objekt, unter Angabe eines beliebigen Formats, in eine Zeichenfolge  um.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
public class ObjectToStringFormatConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        string formatString = parameter as string;

        if (!string.IsNullOrEmpty(formatString))
        {
            if (!string.IsNullOrEmpty(language))
            {
                return string.Format(new CultureInfo(language), formatString, value);
            }
            else
            {
                return string.Format(formatString, value);
            }
        }

        return value.ToString();
    }

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

Verwendung in XAML:

1
2
3
<TextBlock Text="{Binding Currency, Converter={StaticResource ObjectToStringFormatConverter}, ConverterParameter='\{0:C\}'}"/>
<TextBlock Text="{Binding Currency, Converter={StaticResource ObjectToStringFormatConverter}, ConverterParameter='\{0\} xyz'}"/>
<TextBlock Text="{Binding DateTime1, Converter={StaticResource ObjectToStringFormatConverter}, ConverterParameter='\{0:d\}'}"/>

7. BooleanInvertedConverter

Dieser Konverter invertiert einen booleschen Wert. Er kann beispielsweise verwendet werden, um Steuerelemente zu sperren, wenn Daten geladen werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
public class BooleanInvertedConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is bool)
        {
            var booleanValue = (bool)value;
            return !booleanValue;
        }

        return true;
    }

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

Verwendung in XAML:

1
2
<TextBox PlaceholderText="Text eingeben..."
         IsEnabled="{Binding IsLoading, Converter={StaticResource BooleanInvertedConverter}}" />

8. IntegerToAlternatingBrushConverter

Da es beispielsweise bisher noch keine Möglichkeit gibt, einem ItemControl eine alternierende Hintergrundfarbe zuzuweisen, ist dieser Konverter sehr praktisch. Je nachdem ob der Zahlenwert gerade oder ungerade ist, wird ein Brush zurückgeliefert. Die Listenelemente müssen dementsprechend um einen Index-Wert erweitert werden.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
public class IntegerToAlternatingBrushConverter : IValueConverter
{
    private SolidColorBrush brightBrush = new SolidColorBrush(Color.FromArgb(255, 100, 100, 100));
    private SolidColorBrush darkBrush = new SolidColorBrush(Color.FromArgb(255, 30, 30, 30));

    public object Convert(object value, Type targetType, object parameter, string language)
    {
        if (value is int)
        {
            int index = (int)value;

            // Change change alternating starting color
            if (parameter != null)
            {
                index++;
            }

            if (index % 2 != 0)
            {
                return brightBrush;
            }
        }

        return darkBrush;
    }

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

Verwendung in XAML:

1
2
3
4
5
6
7
8
9
<ItemsControl ItemsSource="{Binding ItemList}">
	<ItemsControl.ItemTemplate>
		<DataTemplate>
			<Border Background="{Binding Index, Converter={StaticResource IntegerToAlternatingBrushConverter}, ConverterParameter=1}">
				<TextBlock Text="{Binding Value}"/>
			</Border>
		</DataTemplate>
	</ItemsControl.ItemTemplate>
</ItemsControl>

Beispielprojekt

Das Beispielprojekt ist hier zu finden.