To extend and expand upon the binding experience we have converters to convert one a value of one type into another value of another type.
To leverage Converters in a Databinding you first need to create a DataConverter class tht extens either
IValueConverter
(WPF & UWP) or
IMultiValueConverter
(WPF)if you want to convert multiple types into one type
In this case we focus on converting a boolean True/False
value to the correspionding Visibilities Visibility.Visible
and Visibility.Collapsed
:
public class BooleanToVisibilityConverter : IValueConverter
{
public object Convert(object value, Type targetType, object parameter, string language)
{
return (value is bool && (bool) value) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (value is Visibility && (Visibility) value == Visibility.Visible);
}
}
The Convert
method is called whenever you GET
data FROM
the ViewModel
.
The ConvertBack
is called upon SET
ing data TO
the ViewModel
for BindingMode.TwoWay
bindings.
public class InvertibleBooleanToVisibilityConverter : IValueConverter
{
public bool Invert { get; set; } = false;
public object Convert(object value, Type targetType, object parameter, string language)
{
return (value is bool && (bool) value != Invert) ? Visibility.Visible : Visibility.Collapsed;
}
public object ConvertBack(object value, Type targetType, object parameter, string language)
{
return (value is Visibility && ((Visibility) value == Visibility.Visible) != Invert);
}
}
If you want to use a converter in a Binding
, simply declare it as a resource in your page, window, or other element, give it a key and supply potentially needed properties:
<Page ...
xmlns:converters="using:MyNamespce.Converters">
<Page.Resources>
<converters:InvertibleBooleanToVisibilityConverter
x:Key="BooleanToVisibilityConverter"
Invert="False" />
</Page.Resources>
and use it as a StaticResource
in a binding:
<ProgressRing
Visibility="{Binding ShowBusyIndicator,
Converter={StaticResource BooleanToVisibilityConverter},
UpdateSourceTrigger=PropertyChanged,
Mode=OneWay}" />