using System.Globalization;
using System.Windows;
using System.Windows.Data;
namespace AxiOmron.PcbCheck.Converters;
///
/// 将布尔值转换为 ,支持通过 ConverterParameter 反转判定。
///
///
/// 当 ConverterParameter 为 "Invert"、"Inverse" 或 "!" 时,布尔值的真假意义取反。
///
public sealed class BooleanToVisibilityConverter : IValueConverter
{
///
/// 将布尔值转换为可见性。
///
/// 源布尔值。
/// 目标类型。
/// 若为 "Invert"/"!" 则反转判定。
/// 当前区域信息。
/// 或 。
public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is bool b && b;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag ? Visibility.Visible : Visibility.Collapsed;
}
///
/// 将可见性反向转换为布尔值。
///
/// 目标可见性。
/// 目标类型。
/// 若为 "Invert"/"!" 则反转判定。
/// 当前区域信息。
/// 布尔值。
public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
{
bool flag = value is Visibility v && v == Visibility.Visible;
if (IsInvert(parameter))
{
flag = !flag;
}
return flag;
}
///
/// 判断参数是否要求反转判定。
///
/// 参数值。
/// 是否反转。
private static bool IsInvert(object? parameter)
{
if (parameter is null)
{
return false;
}
string token = parameter.ToString() ?? string.Empty;
return token.Equals("Invert", StringComparison.OrdinalIgnoreCase)
|| token.Equals("Inverse", StringComparison.OrdinalIgnoreCase)
|| token.Equals("!", StringComparison.Ordinal);
}
}