WPF:显示一个布尔值为“是”/“否”

我有一个布尔值,我需要在TextBlock中显示为“是”或“否”。 我正在尝试使用StringFormat来完成此操作,但是我的StringFormat被忽略,并且TextBlock显示“True”或“False”。

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

我的语法有什么问题,或者这种types的StringFormat不受支持?

我知道我可以使用ValueConverter来实现这一点,但StringFormat解决scheme似乎更优雅(如果它的工作)。

你的解决scheme与StringFormat不能工作,因为它不是一个有效的格式string。

我写了一个标记扩展,可以做你想要的。 你可以这样使用它:

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

这里是标记扩展的代码:

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

您也可以使用这个伟大的价值转换器

然后你在XAML中声明如下:

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

你可以像这样使用它:

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

没有转换器

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

还有另一个非常好的select。 检查这一个: Alex141 CalcBinding 。

在我的DataGrid中,我只有:

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

要使用它,只需通过GitHub添加CalcBinding,而不是在UserControl / Windows声明中添加

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

这是一个使用ConverterConverterParameter的解决scheme,它允许您轻松地为不同的Bindings定义不同的strings

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

像这样定义转换器:

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

像这样使用它:

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

如果你需要一个不同的分隔符; (例如. ),而是像这样定义Converter:

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

这是“硬编码”Yes / No值的另一种替代简化转换器

 [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用法

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

下面在datagridtextcolumn里为我工作:我添加了另一个属性到我的类,根据MyBool的值返回一个string。 请注意,在我的情况下,datagrid绑定到MyClass对象的CollectionViewSource。

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