On the 4th of July I blogged about simple visibility converters to toggle visibility. Of course I used two converters then.. one Visibility and another inverse aka Invisibility.
I also said that some clever people might tell me that its possible to do both in a single converter. Whilst that is true, no one did so apparently no one really reads or cares 😐 Coding4Fun toolkit has a converter than exposes Inverted property but my idea was to be able to use the same converter by pass a parameter.
So here’s what I did
public class VisibilityConverter : IValueConverter { public enum Mode { Default, Inverted, } public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { Visibility returnVisibility = Visibility.Visible; Mode mode = Mode.Default; try { if(parameter != null) mode = (Mode)Enum.Parse(typeof(Mode), (string)parameter, true); } catch { mode = Mode.Default; } if (value == null) { returnVisibility = Visibility.Collapsed; } else if(value is bool) { bool bVal = (bool)value; if (!bVal) returnVisibility = Visibility.Collapsed; } else if (value is string) { string itemVal = value as String; if (String.IsNullOrWhiteSpace(itemVal)) returnVisibility = Visibility.Collapsed; } else if (value is IList) { IList objectList = value as IList; if (objectList == null || objectList.Count == 0) returnVisibility = Visibility.Collapsed; } if (mode == Mode.Inverted) return returnVisibility == Visibility.Visible ? Visibility.Collapsed : Visibility.Visible; else return returnVisibility; } public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) { throw new NotImplementedException(); } }
and how do I use it ? well this is how
<TextBlock Text="{Binding Review}" Visibility="{Binding Review, Converter={StaticResource VisibilityConverter}}" TextWrapping="Wrap" Style="{StaticResource PhoneTextNormalStyle}" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2"/> <TextBlock Text="(rating only)" Visibility="{Binding Review, Converter={StaticResource VisibilityConverter}, ConverterParameter=Inverted}" Foreground="{StaticResource PhoneSubtleBrush}" TextWrapping="Wrap" Style="{StaticResource PhoneTextNormalStyle}" Grid.Column="0" Grid.Row="1" Grid.ColumnSpan="2"/>
I could pass Default parameter or just leave it out and it defaults to normal behaviour. If I however pass Inverted parameter to the converter, it inverts the behaviour. Bingo.
Now waiting for the next clever people to tell me that I am using parameter designed for something else 🙂