Почему логическое значение не может быть преобразовано в видимость в привязке без необходимости предоставления логического преобразователя BooleanToVisibilityConverter? - PullRequest
3 голосов
/ 15 марта 2012

Кажется странным, что по умолчанию привязка не может преобразовать логическое значение в видимость без необходимости всегда указывать 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 ]

1 голос
/ 15 марта 2012

Потому что булевы и visiblitiy не имеют одинаковый тип в спине.И есть 2 состояния, которые не видны -> «скрыто» и «свернуто».Исходя из того, что WPF должен решить, что вы хотите?

1 голос
/ 15 марта 2012

Есть три возможных Видимости:

  1. Visible
  2. Hidden
  3. Collapsed

Как преобразовать что-то с двумя состояниями во что-то с тремя?

0 голосов
/ 16 марта 2012

Это чисто информационная информация, но для этого не нужно использовать конвертер.

<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" />
...