using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;
using Catel.Windows.Properties;
namespace Catel.Windows.Data.Converters
{
/// <summary>
/// A base class that makes it easier to create values to visibility converters.
/// </summary>
public abstract class VisibilityConverterBase : IValueConverter
{
#region Constructor & destructor
/// <summary>
/// Initializes a new instance of the <see cref="VisibilityConverterBase"/> class.
/// </summary>
/// <param name="notVisibleVisibility">The <see cref="Visibility"/> state when not visibible should be returned.</param>
/// <exception cref="ArgumentException">when <paramref name="notVisibleVisibility"/> is <see cref="Visibility.Visible"/>.</exception>
protected VisibilityConverterBase(Visibility notVisibleVisibility)
{
if (notVisibleVisibility == Visibility.Visible)
{
throw new ArgumentException(Exceptions.VisibilityIsNotAllowedForConverter, "notVisibleVisibility");
}
NotVisibleVisibility = notVisibleVisibility;
}
#endregion
#region Properties
/// <summary>
/// Gets the <see cref="Visibility"/> state when not visibible should be returned.
/// </summary>
/// <value>The not visible visibility.</value>
public Visibility NotVisibleVisibility { get; private set; }
#endregion
#region Methods
/// <summary>
/// Determines what value this converter should return.
/// </summary>
/// <param name="value">The value produced by the binding source.</param>
/// <param name="targetType">The type of the binding target property.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
/// <returns>
/// <c>true</c> if the specified value is visible; otherwise, <c>false</c>.
/// </returns>
public abstract bool IsVisible(object value, Type targetType, object parameter, CultureInfo culture);
/// <summary>
/// Converts a value.
/// </summary>
/// <param name="value">The value produced by the binding source.</param>
/// <param name="targetType">The type of the binding target property.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
/// <returns>
/// A converted value. If the method returns null, the valid null value is used.
/// </returns>
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
return IsVisible(value, targetType, parameter, culture) ? Visibility.Visible : NotVisibleVisibility;
}
/// <summary>
/// Converts a value.
/// </summary>
/// <param name="value">The value that is produced by the binding target.</param>
/// <param name="targetType">The type to convert to.</param>
/// <param name="parameter">The converter parameter to use.</param>
/// <param name="culture">The culture to use in the converter.</param>
/// <returns>
/// A converted value. If the method returns null, the valid null value is used.
/// </returns>
/// <remarks>
/// By default, this method does nothing.
/// </remarks>
public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
return ConverterHelper.DoNothingBindingValue;
}
#endregion
}
/// <summary>
/// A base class that makes it easier to create values to visibility converters.
/// <para />
/// This converter returns <see cref="Visibility.Collapsed"/> when a non-visible state should be returned.
/// </summary>
public abstract class CollapsingVisibilityConverterBase : VisibilityConverterBase
{
/// <summary>
/// Initializes a new instance of the <see cref="CollapsingVisibilityConverterBase"/> class.
/// </summary>
protected CollapsingVisibilityConverterBase()
: base(Visibility.Collapsed) { }
}
#if !SILVERLIGHT
/// <summary>
/// A base class that makes it easier to create values to visibility converters.
/// <para />
/// This converter returns <see cref="Visibility.Hidden"/> when a non-visible state should be returned.
/// </summary>
public abstract class HidingVisibilityConverterBase : VisibilityConverterBase
{
/// <summary>
/// Initializes a new instance of the <see cref="HidingVisibilityConverterBase"/> class.
/// </summary>
protected HidingVisibilityConverterBase()
: base(Visibility.Hidden) { }
}
#endif
}