wake-up-neo.com

WPF: Zeigen Sie einen Bool-Wert als "Ja"/"Nein" an.

Ich habe einen bool-Wert, den ich in einem TextBlock als "Ja" oder "Nein" anzeigen muss. Ich versuche, dies mit einem StringFormat auszuführen, aber mein StringFormat wird ignoriert und der TextBlock zeigt "True" oder "False" an.

<TextBlock Text="{Binding Path=MyBoolValue, StringFormat='{}{0:Yes;;No}'}" />

Stimmt etwas mit meiner Syntax nicht oder wird diese Art von StringFormat nicht unterstützt?

Ich weiß, dass ich einen ValueConverter verwenden kann, um dies zu erreichen, aber die StringFormat-Lösung scheint eleganter zu sein (wenn es funktioniert).

41
John Myczek

Ihre Lösung mit StringFormat kann nicht funktionieren, da es keine gültige Formatzeichenfolge ist.

Ich habe eine Markup-Erweiterung geschrieben, die das tun würde, was Sie wollen. Sie können es so verwenden:

<TextBlock Text="{my:SwitchBinding MyBoolValue, Yes, No}" />

Hier der Code für die Markup-Erweiterung:

public class SwitchBindingExtension : Binding
{
    public SwitchBindingExtension()
    {
        Initialize();
    }

    public SwitchBindingExtension(string path)
        : base(path)
    {
        Initialize();
    }

    public SwitchBindingExtension(string path, object valueIfTrue, object valueIfFalse)
        : base(path)
    {
        Initialize();
        this.ValueIfTrue = valueIfTrue;
        this.ValueIfFalse = valueIfFalse;
    }

    private void Initialize()
    {
        this.ValueIfTrue = Binding.DoNothing;
        this.ValueIfFalse = Binding.DoNothing;
        this.Converter = new SwitchConverter(this);
    }

    [ConstructorArgument("valueIfTrue")]
    public object ValueIfTrue { get; set; }

    [ConstructorArgument("valueIfFalse")]
    public object ValueIfFalse { get; set; }

    private class SwitchConverter : IValueConverter
    {
        public SwitchConverter(SwitchBindingExtension switchExtension)
        {
            _switch = switchExtension;
        }

        private SwitchBindingExtension _switch;

        #region IValueConverter Members

        public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            try
            {
                bool b = System.Convert.ToBoolean(value);
                return b ? _switch.ValueIfTrue : _switch.ValueIfFalse;
            }
            catch
            {
                return DependencyProperty.UnsetValue;
            }
        }

        public object ConvertBack(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture)
        {
            return Binding.DoNothing;
        }

        #endregion
    }

}
43
Thomas Levesque

Sie können auch diesen günstigen Wertkonverter verwenden.

Dann deklarieren Sie in XAML so etwas:

<local:BoolToStringConverter x:Key="BooleanToStringConverter" FalseValue="No" TrueValue="Yes" />

Und du kannst es so benutzen:

<TextBlock Text="{Binding Path=MyBoolValue, Converter={StaticResource BooleanToStringConverter}}" />
57
alf

Ohne Konverter 

            <TextBlock.Style>
                <Style TargetType="{x:Type TextBlock}">
                    <Setter Property="Text" Value="OFF" />
                    <Style.Triggers>
                        <DataTrigger Binding="{Binding MyBoolValue}" Value="True">
                            <Setter Property="Text" Value="ON" />
                        </DataTrigger>
                    </Style.Triggers>
                </Style>
            </TextBlock.Style>
29
Cedre

Es gibt auch eine weitere wirklich gute Option. Überprüfen Sie dieses: Alex141 CalcBinding

In meinem DataGrid habe ich nur:

<DataGridTextColumn Header="Mobile?" Binding="{conv:Binding (IsMobile?\'Yes\':\'No\')}" />

Um es zu verwenden, müssen Sie lediglich CalcBinding über GitHub hinzufügen, als in der UserControl/Windows-Deklaration

<Windows XXXXX xmlns:conv="clr-namespace:CalcBinding;Assembly=CalcBinding"/>
3
Simon

Dies ist eine Lösung, die eine Converter und die ConverterParameter verwendet, mit der Sie leicht verschiedene strings für verschiedene Bindings definieren können:

public class BoolToStringConverter : IValueConverter
{
    public char Separator { get; set; } = ';';

    public object Convert(object value, Type targetType, object parameter,
                          CultureInfo culture)
    {
        var strings = ((string)parameter).Split(Separator);
        var trueString = strings[0];
        var falseString = strings[1];

        var boolValue = (bool)value;
        if (boolValue == true)
        {
            return trueString;
        }
        else
        {
            return falseString;
        }
    }

    public object ConvertBack(object value, Type targetType, object parameter,
                              CultureInfo culture)
    {
        var strings = ((string)parameter).Split(Separator);
        var trueString = strings[0];
        var falseString = strings[1];

        var stringValue = (string)value;
        if (stringValue == trueString)
        {
            return true;
        }
        else
        {
            return false;
        }
    }
}

Definieren Sie den Konverter folgendermaßen:

<local:BoolToStringConverter x:Key="BoolToStringConverter" />

Und benutze es so:

<TextBlock Text="{Binding MyBoolValue, Converter={StaticResource BoolToStringConverter},
                                       ConverterParameter='Yes;No'}" />

Wenn Sie ein anderes Trennzeichen als ; benötigen (beispielsweise .), definieren Sie den Konverter stattdessen wie folgt:

<local:BoolToStringConverter x:Key="BoolToStringConverter" Separator="." />
2
Tim Pohlmann

Dies ist ein weiterer alternativer vereinfachter Konverter mit "fest codierten" Ja/Nein-Werten

[ValueConversion(typeof (bool), typeof (bool))]
public class YesNoBoolConverter : IValueConverter
{
    public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    {
        var boolValue = value is bool && (bool) value;

        return boolValue ? "Yes" : "No";
    }

    public object ConvertBack(object value, Type targetType, object parameter, CultureInfo culture)
    {
        return value != null && value.ToString() == "Yes";
    }
}

XAML-Nutzung

<DataGridTextColumn Header="Is Listed?" Binding="{Binding Path=IsListed, Mode=TwoWay, Converter={StaticResource YesNoBoolConverter}}" Width="110" IsReadOnly="True" TextElement.FontSize="12" />
1
Kwex

Folgendes funktionierte für mich in einer Datagridtextcolumn: Ich fügte meiner Klasse eine weitere Eigenschaft hinzu, die abhängig vom Wert von MyBool ..__ eine Zeichenfolge zurückgab. Beachten Sie, dass in meinem Fall das Datagrid an eine CollectionViewSource von MyClass-Objekten gebunden war.

C #:

public class MyClass        
{     
    public bool MyBool {get; set;}   

    public string BoolString    
    {    
        get { return MyBool == true ? "Yes" : "No"; }    
    }    
}           

XAML:

<DataGridTextColumn Header="Status" Binding="{Binding BoolString}">
0
MGDsoft