如何翻转BooleanToVisibilityConverter?

24 浏览
0 Comments

如何翻转BooleanToVisibilityConverter?

我在WPF中使用BooleanToVisibilityConverter将一个控件的Visibility属性绑定到一个Boolean值。这个方法是有效的,但是我想让其中的一个控件在true情况下隐藏,false情况下显示。

admin 更改状态以发布 2023年5月21日
0
0 Comments

现在最好的解决方案是编写自己的转换器。这里是一个可以正常方式和倒置方式进行转换的示例。如果您在使用过程中遇到任何问题,请随时提出。

[ValueConversion(typeof(bool), typeof(Visibility))]
public class InvertableBooleanToVisibilityConverter : IValueConverter
{
    enum Parameters
    {
        Normal, Inverted
    }
    public object Convert(object value, Type targetType,
                          object parameter, CultureInfo culture)
    {
        var boolValue = (bool)value;
        var direction = (Parameters)Enum.Parse(typeof(Parameters), (string)parameter);
        if(direction == Parameters.Inverted)
            return !boolValue? Visibility.Visible : Visibility.Collapsed;
        return boolValue? Visibility.Visible : Visibility.Collapsed;
    }
    public object ConvertBack(object value, Type targetType,
        object parameter, CultureInfo culture)
    {
        return null;
    }
}



  


0
0 Comments

除了反转之外,您可以使用通用的IValueConverter实现来将布尔值转换为可配置的真假目标值以实现相同的目标。以下是一个这样的实现:

public class BooleanConverter : IValueConverter
{
    public BooleanConverter(T trueValue, T falseValue)
    {
        True = trueValue;
        False = falseValue;
    }
    public T True { get; set; }
    public T False { get; set; }
    public virtual object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is bool && ((bool) value) ? True : False;
    }
    public virtual object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value is T && EqualityComparer.Default.Equals((T) value, True);
    }
}

接下来,子类化它,其中TVisibility:

public sealed class BooleanToVisibilityConverter : BooleanConverter
{
    public BooleanToVisibilityConverter() : 
        base(Visibility.Visible, Visibility.Collapsed) {}
}

最后,这是您如何在XAML中使用上面的BooleanToVisibilityConverter并配置它,例如使用Collapsed用于真和Visible用于假:


    

当您想绑定到名为IsHidden而不是IsVisible的布尔属性时,这种反转非常有用。

0