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"/>
这是一个使用Converter
和ConverterParameter
的解决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}">