number decimals wpf data-binding xaml formatting

decimals - textbox wpf format



WPF: muestra un valor de bool como "Sí"/"No" (7)

Esta es una solución que utiliza un Converter y el ConverterParameter que le permite definir fácilmente diferentes strings para diferentes Bindings :

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; } } }

Defina el convertidor así:

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

Y úsalo así:

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

Si necesita un separador diferente que ; (por ejemplo . ), defina el convertidor como este en su lugar:

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

Tengo un valor bool que necesito mostrar como "Sí" o "No" en un TextBlock. Estoy tratando de hacer esto con un StringFormat, pero mi StringFormat se ignora y TextBlock muestra "True" o "False".

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

¿Hay algún problema con mi sintaxis o este tipo de StringFormat no es compatible?

Sé que puedo usar un ValueConverter para lograr esto, pero la solución StringFormat parece más elegante (si funcionó).


Este es otro convertidor simplificado alternativo con valores "sí / no codificados"

[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"; } }

Uso de XAML

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


Lo siguiente funcionó para mí dentro de un datagridtextcolumn: agregué otra propiedad a mi clase que devolvió una cadena dependiendo del valor de MyBool. Tenga en cuenta que, en mi caso, la cuadrícula de datos estaba vinculada a un objeto CollectionViewSource de MyClass.

DO#:

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

XAML:

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


Sin convertidor

<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>


Su solución con StringFormat no puede funcionar, porque no es una cadena de formato válida.

Escribí una extensión de marcado que haría lo que quisiera. Puedes usarlo así:

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

Aquí el código para la extensión de marcado:

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 } }


También hay otra opción realmente genial. Comprueba este: Alex141 CalcBinding .

En mi DataGrid, solo tengo:

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

Para usarlo, solo tiene que agregar CalcBinding a través de GitHub, que en la declaración UserControl / Windows, agrega

<Windows XXXXX xmlns:conv="clr-namespace:CalcBinding;assembly=CalcBinding"/>


También puedes usar este gran convertidor de valor

Luego declaras en XAML algo como esto:

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

Y puedes usarlo así:

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