I often have to dim a button to indicate that it is disabled, and I want to do that via data binding.
Thus, I want my button to look more or less like this:
<Button x:Name="StartButton" Opacity="{Binding CanStart, Converter={StaticResource CanStartOpacityConverter}}" Command="{Binding StartCommand}" FontAttributes="Bold" FontSize="16" HeightRequest="50" HorizontalOptions="Center" Text="{Binding StartText}" TextColor="White" VerticalOptions="Center" WidthRequest="116" />
The key line is the second, where the opacity is bound to a property, CanStart and converted by the CanStartOpacityConverter.
The CanStart is a standard boolean property.
The magic is in the converter. For this, I wrote the following custom converter, which is designed to take in a bool and spit out a percentage:
public class BoolToPercentConverter : IValueConverter { public double True { get; set; } public double False { get; set; } public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { if (value == null) { return False; } if (value.GetType() != typeof(bool)) { return False; } return ((bool)value) ? True : False; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { return value; } }
This allows me to create an instance of the converter, setting the percent value for True and False,
<converters:BoolToPercentConverter x:Key="CanStartOpacityConverter" True="1" False="0.4" />
Now, to dim the button, all I have to do is set CanStart to false and its opacity is set to 40%
Remember, this is only the UI, you still have to disable the button!
Hi, thanks for this post, I like it and can think of a number of things this would be useful for. For this specific example though, wouldn’t a Trigger be more useful? For example, have it based on IsEnabled and do the dimming? You could still bind IsEnabled to the CanStart property.
I admit I’m still very new to Xamarin so maybe I’m mixing up too much WPF…