// ------------------------------------------------------------------
// Member of the WPFSmartLibrary
// For more information see : (coming soon ...)
// (by DotNetMastermind)
//
// filename : VisibilityConverter.cs
// namespace : SoftArcs.WPFSmartLibrary.ValueConverter
// class(es) : BoolToVisibilityConverter
// BoolToVisibleOrHiddenConverter
// BoolToVisibleOrCollapsedConverter
// BoolToVisibleOrCollapsedOrHiddenConverter
// BooleanStringToVisibilityConverter
// StringToVisibilityConverter
// ------------------------------------------------------------------
using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using System.Windows.Markup;
namespace SoftArcs.WPFSmartLibrary.ValueConverter
{
/// <summary>
/// Converts a Boolean value into a Visibility enumeration (and back)
/// </summary>
[ValueConversion( typeof( bool ), typeof( Visibility ) )]
[MarkupExtensionReturnType( typeof( BoolToVisibilityConverter ) )]
public class BoolToVisibilityConverter : MarkupExtension, IValueConverter
{
/// <summary>
/// FalseEquivalent (default : Visibility.Collapsed => see Constructor)
/// </summary>
public Visibility FalseEquivalent { get; set; }
/// <summary>
/// Define whether the opposite boolean value is crucial (default : false)
/// </summary>
public bool OppositeBooleanValue { get; set; }
/// <summary>
/// Initialize the properties with standard values
/// </summary>
public BoolToVisibilityConverter()
{
this.FalseEquivalent = Visibility.Collapsed;
this.OppositeBooleanValue = false;
}
//+------------------------------------------------------------------------
//+ Usage :
//+ -------
//+ 1. <conv:BoolToVisibilityConverter x:Key="BoolToVisibilityConverter" />
//+ 2. {Binding ... Converter={StaticResource BoolToVisibilityConverter}
//+------------------------------------------------------------------------
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool && targetType == typeof( Visibility ))
{
bool? booleanValue = (bool?)value;
if (this.OppositeBooleanValue == true)
{
booleanValue = !booleanValue;
}
return booleanValue.GetValueOrDefault() ? Visibility.Visible : FalseEquivalent;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibilityValue = (Visibility)value;
if (this.OppositeBooleanValue == true)
{
visibilityValue = visibilityValue == Visibility.Visible ? FalseEquivalent : Visibility.Visible;
}
return (visibilityValue == Visibility.Visible);
}
return value;
}
#endregion // IValueConverter Members
//+-----------------------------------------------------------------------------------
//+ Usage : (wpfsl: => XML Namespace mapping to the "BoolToVisibilityConverter" class)
//+ -------
//+ Use as follows : {Binding ... Converter={wpfsl:BoolToVisibilityConverter}
//+ NO StaticResource required
//+-----------------------------------------------------------------------------------
#region MarkupExtension "overrides"
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new BoolToVisibilityConverter
{
FalseEquivalent = this.FalseEquivalent,
OppositeBooleanValue = this.OppositeBooleanValue
};
}
#endregion
}
/// <summary>
/// Converts a Boolean value into a Visibility enumeration (and back)
/// FalseEquivalent is always Visibility.Hidden
///!Deprecated : It is recommended to use the more flexible 'BoolToVisibilityConverter' instead
/// </summary>
[ValueConversion( typeof( bool ), typeof( Visibility ) )]
public class BoolToVisibleOrHiddenConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool && targetType == typeof( Visibility ))
{
bool bValue = (bool)value;
if (bValue)
return Visibility.Visible;
return Visibility.Hidden;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Visible)
return true;
return false;
}
return value;
}
#endregion
}
/// <summary>
/// Converts a Boolean value into a Visibility enumeration (and back)
/// FalseEquivalent is always Visibility.Collapsed
///!Deprecated : It is recommended to use the more flexible 'BoolToVisibilityConverter' instead
/// </summary>
[ValueConversion( typeof( bool ), typeof( Visibility ) )]
public class BoolToVisibleOrCollapsedConverter : IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool && targetType == typeof( Visibility ))
{
return ((bool)value) ? Visibility.Visible : Visibility.Collapsed;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
return ((Visibility)value == Visibility.Visible);
}
return value;
}
#endregion
}
/// <summary>
/// Converts a Boolean value into a Visibility enumeration (and back)
/// FalseEquivalent can be defined with the property 'Collapse'
///!Deprecated : It is recommended to use the more flexible 'BoolToVisibilityConverter' instead
/// </summary>
[ValueConversion( typeof( bool ), typeof( Visibility ) )]
public class BoolToVisibleOrCollapsedOrHiddenConverter : IValueConverter
{
/// <summary>
/// Collapse (default : Visibility.Hidden, because a bool is 'false' by default)
/// true => 'False-Equivalent' = Visibility.Collapsed
/// false => 'False-Equivalent' = Visibility.Hidden
/// </summary>
public bool Collapse { get; set; }
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is bool && targetType == typeof( Visibility ))
{
bool bValue = (bool)value;
if (bValue)
{
return Visibility.Visible;
}
if (Collapse)
{
return Visibility.Collapsed;
}
return Visibility.Hidden;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
Visibility visibility = (Visibility)value;
if (visibility == Visibility.Visible)
return true;
return false;
}
return value;
}
#endregion // IValueConverter Members
}
/// <summary>
/// Converts a String into a Visibility enumeration (and back)
/// FalseEquivalent is always Visibility.Collapsed
/// </summary>
[ValueConversion( typeof( string ), typeof( Visibility ) )]
[MarkupExtensionReturnType( typeof( BooleanStringToVisibilityConverter ) )]
public class BooleanStringToVisibilityConverter : MarkupExtension, IValueConverter
{
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string && targetType == typeof( Visibility ))
{
return ((value as string).ToLower().Equals( "true" )) ? Visibility.Visible : Visibility.Collapsed;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter,
CultureInfo culture)
{
if (value is Visibility)
{
return ((Visibility)value == Visibility.Visible) ? "true" : "false";
}
return value;
}
#endregion
#region MarkupExtension "overrides"
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new BooleanStringToVisibilityConverter();
}
#endregion
}
/// <summary>
/// Converts a String into a Visibility enumeration (and back)
/// The FalseEquivalent can be declared with the "FalseEquivalent" property
/// </summary>
[ValueConversion( typeof( string ), typeof( Visibility ) )]
[MarkupExtensionReturnType( typeof( StringToVisibilityConverter ) )]
public class StringToVisibilityConverter : MarkupExtension, IValueConverter
{
/// <summary>
/// FalseEquivalent (default : Visibility.Collapsed => see Constructor)
/// </summary>
public Visibility FalseEquivalent { get; set; }
/// <summary>
/// Define whether the opposite boolean value is crucial (default : false)
/// </summary>
public bool OppositeStringValue { get; set; }
/// <summary>
/// Initialize the properties with standard values
/// </summary>
public StringToVisibilityConverter()
{
this.FalseEquivalent = Visibility.Collapsed;
this.OppositeStringValue = false;
}
#region IValueConverter Members
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is string && targetType == typeof( Visibility ))
{
if (this.OppositeStringValue == true)
{
return ((value as string).ToLower().Equals( String.Empty )) ? Visibility.Visible : this.FalseEquivalent;
}
return ((value as string).ToLower().Equals( String.Empty )) ? this.FalseEquivalent : Visibility.Visible;
}
return value;
}
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
if (value is Visibility)
{
if (this.OppositeStringValue == true)
{
return ((Visibility)value == Visibility.Visible) ? String.Empty : "visible";
}
return ((Visibility)value == Visibility.Visible) ? "visible" : String.Empty;
}
return value;
}
#endregion
#region MarkupExtension "overrides"
public override object ProvideValue(IServiceProvider serviceProvider)
{
return new StringToVisibilityConverter
{
FalseEquivalent = this.FalseEquivalent,
OppositeStringValue = this.OppositeStringValue
};
}
#endregion
}
}