WPF: Visualizza un valore bool come “Sì” / “No”

Ho un valore bool che ho bisogno di visualizzare come “Sì” o “No” in un TextBlock. Sto cercando di farlo con un StringFormat, ma il mio StringFormat viene ignorato e il TextBlock mostra “True” o “False”.

 

C’è qualcosa di sbagliato nella mia syntax, o questo tipo di StringFormat non è supportato?

So che posso usare un ValueConverter per realizzare questo, ma la soluzione StringFormat sembra più elegante (se funzionasse).

La tua soluzione con StringFormat non può funzionare, perché non è una stringa di formato valida.

Ho scritto un’estensione di markup che farebbe quello che vuoi. Puoi usarlo in questo modo:

  

Qui il codice per l’estensione markup:

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

Puoi anche usare questo ottimo convertitore di valore

Quindi dichiari in XAML qualcosa del genere:

  

E puoi usarlo in questo modo:

  

Senza convertitore

     

C’è anche un’altra opzione davvero fantastica. Controlla questo: Alex141 CalcBinding .

Nel mio DataGrid, ho solo:

  

Per usarlo, devi solo aggiungere CalcBinding tramite GitHub, che nella dichiarazione UserControl / Windows, devi aggiungere

  

Questa è una soluzione che utilizza un Converter e il ConverterParameter che consente di definire facilmente strings diverse per diversi 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; } } } 

Definisci il convertitore in questo modo:

  

E usalo in questo modo:

  

Se hai bisogno di un separatore diverso da ; (per esempio . ), definisci il convertitore come questo, invece:

  

Questo è un altro convertitore semplificato alternativo con valori Sì / No “hardcoded”

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

Utilizzo XAML

  

Il seguente ha funzionato per me all’interno di un datagridtextcolumn: ho aggiunto un’altra proprietà alla mia class che restituiva una stringa in base al valore di MyBool. Si noti che nel mio caso il datagrid era associato a un object CollectionViewSource di MyClass.

C #:

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

XAML: