如何反转BooleanToVisibilityConverter?

128 .net wpf binding visibility

BooleanToVisibilityConverter在WPF中使用a 将Visibility控件的属性绑定到a Boolean.这工作正常,但我想要一个控件隐藏如果布尔是true,并显示它是否false.

Ati*_*ziz 237

您可以通过使用IValueConverter可将布尔值转换为true和false的可配置目标值的通用实现来实现相同的目标,而不是反转.以下是一个这样的实现:

public class BooleanConverter<T> : 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<T>.Default.Equals((T) value, True);
    }
}
Run Code Online (Sandbox Code Playgroud)

其次,它的子类,其中TVisibility:

public sealed class BooleanToVisibilityConverter : BooleanConverter<Visibility>
{
    public BooleanToVisibilityConverter() : 
        base(Visibility.Visible, Visibility.Collapsed) {}
}
Run Code Online (Sandbox Code Playgroud)

最后,这就是你如何BooleanToVisibilityConverter在XAML中使用上面的内容并将其配置为,例如,Collapsed用于true和Visiblefalse:

<Application.Resources>
    <app:BooleanToVisibilityConverter 
        x:Key="BooleanToVisibilityConverter" 
        True="Collapsed" 
        False="Visible" />
</Application.Resources>
Run Code Online (Sandbox Code Playgroud)

当你想绑定到名为布尔属性这反演是有用的IsHidden,而不是IsVisible.

  • @OscarRyz:随着更复杂的UI,开始为视图模型添加了许多非常令人讨厌的混乱,更不用说理论上必须进行单元测试的另一个属性以维护代码覆盖.视图模型不应该**接近视图的实现细节,否则您可能只在视图模型中具有"可见性"属性. (8认同)

Sim*_*mon 48

using System;
using System.Globalization;
using System.Windows;
using System.Windows.Data;

public sealed class BooleanToVisibilityConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var flag = false;
        if (value is bool)
        {
            flag = (bool)value;
        }
        else if (value is bool?)
        {
            var nullable = (bool?)value;
            flag = nullable.GetValueOrDefault();
        }
        if (parameter != null)
        {
            if (bool.Parse((string)parameter))
            {
                flag = !flag;
            }
        }
        if (flag)
        {
            return Visibility.Visible;
        }
        else
        {
            return Visibility.Collapsed;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var back = ((value is Visibility) && (((Visibility)value) == Visibility.Visible));
        if (parameter != null)
        {
            if ((bool)parameter)
            {
                back = !back;
            }
        }
        return back;
    }
}
Run Code Online (Sandbox Code Playgroud)

然后传递一个true或false作为ConverterParameter

       <Grid.Visibility>
                <Binding Path="IsYesNoButtonSetVisible" Converter="{StaticResource booleanToVisibilityConverter}" ConverterParameter="true"/>
        </Grid.Visibility>
Run Code Online (Sandbox Code Playgroud)

  • 在'else if(值是bool?)`部分,ReSharper告诉我"Expression总是假的".另外,`if(flag)`部分可以更简洁地重写为`return flag?Visibility.Visible:Visibility.Collapsed;`. (4认同)

Mic*_*ios 43

写你自己是目前最好的解决方案.这是一个转换器的例子,可以做正常和反向两种方式.如果你有任何问题,请问.

[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;
    }
}
Run Code Online (Sandbox Code Playgroud)
<UserControl.Resources>
  <Converters:InvertableBooleanToVisibilityConverter x:Key="_Converter"/>
</UserControl.Resources>

<Button Visibility="{Binding IsRunning, Converter={StaticResource _Converter}, ConverterParameter=Inverted}">Start</Button>
Run Code Online (Sandbox Code Playgroud)

  • 只是想知道一件事.xaml代码"绑定IsRunning",其中是sourcode或对象"IsRunning"的值? (2认同)
  • 您可以通过检查参数是否为null来代替常规的BooleanToVisibilityConverter。if(parameter!= null)direction =(Parameter)Enum.Parse(typeof(Parameter),(string)parameter);` (2认同)

Cam*_*and 20

Codeplex 上还有WPF转换器项目.在他们的文档中,他们说你可以使用他们的MapConverter从Visibility枚举转换为bool

<Label>
    <Label.Visible>
        <Binding Path="IsVisible">
            <Binding.Converter>
                <con:MapConverter>
                    <con:Mapping From="True" To="{x:Static Visibility.Visible}"/>
                    <con:Mapping From="False" To="{x:Static Visibility.Hidden}"/>
                </con:MapConverter>
            </Binding.Converter>
        </Binding>
    </Label.Visible>
</Label>
Run Code Online (Sandbox Code Playgroud)

  • WPF 转换器现在包含一个可以反转的 BooleanToVisibilityConverter。 (2认同)

Ste*_*ham 18

实现自己的IValueConverter实现.示例实现位于

http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx

在Convert方法中,让它返回您想要的值而不是默认值.


Mar*_*bad 16

使用xaml Control Visibility属性绑定ViewModel布尔值(IsButtonVisible)的另一种方法.没有编码,没有转换,只是造型.

<Style TargetType={x:Type Button} x:Key="HideShow">
   <Style.Triggers>
      <DataTrigger Binding="{Binding IsButtonVisible}" Value="False">
          <Setter Property="Visibility" Value="Hidden"/>
      </DataTrigger>
   </Style.Triggers>
</Style>

<Button Style="{StaticResource HideShow}">Hello</Button>
Run Code Online (Sandbox Code Playgroud)


Ros*_*ver 12

或者真正的懒人方式,只需利用已有的东西并翻转它:

public class InverseBooleanToVisibilityConverter : IValueConverter
{
    private BooleanToVisibilityConverter _converter = new BooleanToVisibilityConverter();

    public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = _converter.Convert(value, targetType, parameter, culture) as Visibility?;
        return result == Visibility.Collapsed ? Visibility.Visible : Visibility.Collapsed;
    }

    public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
    {
        var result = _converter.ConvertBack(value, targetType, parameter, culture) as bool?;
        return result == true ? false : true;
    }
}
Run Code Online (Sandbox Code Playgroud)


Hai*_*nan 10

如果你不喜欢编写自定义转换器,你可以使用数据触发器来解决这个问题:

<Style.Triggers>
        <DataTrigger Binding="{Binding YourBinaryOption}" Value="True">
                 <Setter Property="Visibility" Value="Visible" />
        </DataTrigger>
        <DataTrigger Binding="{Binding YourBinaryOption}" Value="False">
                 <Setter Property="Visibility" Value="Collapsed" />
        </DataTrigger>
</Style.Triggers>
Run Code Online (Sandbox Code Playgroud)