컨트롤 BooleanToVisibilityConverter의 Visibility속성 을에 바인딩하기 위해 WPF에서을 사용 하고 Boolean있습니다. 이것은 잘 작동하지만 부울이 true인 경우 숨기고 컨트롤인지 표시하는 컨트롤 중 하나를 원합니다 false.
답변
IValueConverter를 직접 구현하십시오. 샘플 구현은
http://msdn.microsoft.com/en-us/library/system.windows.data.ivalueconverter.aspx
Convert 메서드에서 기본값 대신 원하는 값을 반환하도록합니다.
답변
반전하는 대신 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);
    }
}
여기서 다음, 그것을 서브 클래스 T입니다 Visibility:
public sealed class BooleanToVisibilityConverter : BooleanConverter<Visibility>
{
    public BooleanToVisibilityConverter() :
        base(Visibility.Visible, Visibility.Collapsed) {}
}
마지막으로 BooleanToVisibilityConverterXAML에서 위와 같이 사용 하고 예를 들어 Collapsedtrue와 Visiblefalse에 대해 구성 할 수 있습니다 .
<Application.Resources>
    <app:BooleanToVisibilityConverter
        x:Key="BooleanToVisibilityConverter"
        True="Collapsed"
        False="Visible" />
</Application.Resources>
이 반전은 IsHiddenopposed 라는 부울 속성에 바인딩하려는 경우에 유용합니다 IsVisible.
답변
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;
    }
}
그런 다음 ConverterParameter로 true 또는 false를 전달하십시오.
       <Grid.Visibility>
                <Binding Path="IsYesNoButtonSetVisible" Converter="{StaticResource booleanToVisibilityConverter}" ConverterParameter="true"/>
        </Grid.Visibility>
답변
나만의 솔루션을 지금 작성하십시오. 다음은 Normal과 Inverted를 모두 수행 할 수있는 변환기의 예입니다. 이것에 문제가 있으면 물어보십시오.
[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;
    }
}
<UserControl.Resources>
  <Converters:InvertableBooleanToVisibilityConverter x:Key="_Converter"/>
</UserControl.Resources>
<Button Visibility="{Binding IsRunning, Converter={StaticResource _Converter}, ConverterParameter=Inverted}">Start</Button>
답변
Codeplex 에는 WPF Converters 프로젝트 도 있습니다 . 그들의 문서에서 그들은 당신이 Visibility 열거에서 bool로 변환 하기 위해 MapConverter 를 사용할 수 있다고 말합니다.
<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>
답변
xaml 컨트롤 가시성 속성을 사용하여 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>
답변
또는 진짜 게으른 사람의 방식으로 이미 존재하는 것을 사용하고 뒤집으십시오.
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;
    }
}