为什么不能在Binding中将Boolean转换为Visibility而不必提供BooleanToVisibilityConverter?

时间:2012-03-15 16:06:01

标签: wpf user-interface boolean visibility

看起来奇怪的是,绑定无法在默认情况下将布尔值转换为可见性,而无需每次都提供BooleanToVisibilityConverter。谁知道为什么?

更新

我现在找到了一种方法:

像这样创建一个TypeConverter:

public class VisibilityFromBooleanConverter : TypeConverter
{
  public override bool CanConvertFrom(ITypeDescriptorContext context, Type sourceType)
  {
    if (sourceType == typeof(Boolean)) return true;
    return base.CanConvertFrom(context, sourceType);
  }

  public override object ConvertFrom(ITypeDescriptorContext context,
    System.Globalization.CultureInfo culture, object value)
  {
    if (value is Boolean) return ((Boolean)value) ? Visibility.Visible :
      Visibility.Collapsed;
    return base.ConvertFrom(context, culture, value);
  }

}

并将其添加到您的应用中:

TypeDescriptor.AddAttributes(typeof(Visibility),
  new TypeConverterAttribute(typeof(VisibilityFromBooleanConverter)));

它似乎工作得很好。现在,您不必为每个布尔绑定提供BooleanToVisibilityConverter。

3 个答案:

答案 0 :(得分:1)

有三种可能的可见性:

  1. Visible
  2. Hidden
  3. Collapsed
  4. 如何将具有两种状态的东西转换为具有三种状态的东西?

答案 1 :(得分:1)

因为boolean和visiblitiy在后面没有相同的类型。 并且有2个状态不可见 - > “隐藏”和“崩溃”。根据WPF应该决定你想要什么?

答案 2 :(得分:0)

这纯粹是信息性的,但它不必使用转换器

<Button x:Name="TestButton" Content="Test" Width="110" Height="26">
  <Button.Style>
    <Style TargetType="{x:Type Button}">
      <Style.Triggers>
        <DataTrigger Binding="{Binding RelativeSource={RelativeSource Mode=Self}, Path=IsEnabled}" Value="False">
          <Setter Property="Visibility" Value="Hidden"/>
        </DataTrigger>
      </Style.Triggers>
    </Style>
  </Button.Style>
</Button>

<CheckBox IsChecked="{Binding ElementName=TestButton, Path=IsEnabled}" Width="110" Height="23" Content="Check me" Margin="280,108,49,104" />