我有一个bool值,我需要在TextBlock中显示为“是”或“否”。我试图用StringFormat做这个,但我的StringFormat被忽略,TextBlock显示“True”或“False”。
<TextBlock Text="{Binding Path=MyBoolValue, StringFormat='{}{0:Yes;;No}'}" />
我的语法有问题,还是不支持这种类型的StringFormat?
我知道我可以使用ValueConverter来实现这一目标,但StringFormat解决方案看起来更优雅(如果有效)。
答案 0 :(得分:57)
您也可以使用this great value converter
然后你在XAML中声明如下:
<local:BoolToStringConverter x:Key="BooleanToStringConverter" FalseValue="No" TrueValue="Yes" />
你可以像这样使用它:
<TextBlock Text="{Binding Path=MyBoolValue, Converter={StaticResource BooleanToStringConverter}}" />
答案 1 :(得分:43)
使用StringFormat的解决方案无效,因为它不是有效的格式字符串。
我写了一个标记扩展,可以做你想要的。您可以这样使用它:
<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
}
}
答案 2 :(得分:29)
没有转换器
<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>
答案 3 :(得分:3)
还有另一个非常好的选择。检查一下: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"/>
答案 4 :(得分:2)
这是一个使用Converter
和ConverterParameter
的解决方案,可让您轻松为不同的strings
定义不同的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;
}
}
}
像这样定义转换器:
<local:BoolToStringConverter x:Key="BoolToStringConverter" />
并像这样使用它:
<TextBlock Text="{Binding MyBoolValue, Converter={StaticResource BoolToStringConverter},
ConverterParameter='Yes;No'}" />
如果您需要与;
不同的分隔符(例如.
),请改为定义转换器:
<local:BoolToStringConverter x:Key="BoolToStringConverter" Separator="." />
答案 5 :(得分:1)
这是另一种具有“硬编码”是/否值
的简化转换器[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" />
答案 6 :(得分:0)
以下在datagridtextcolumn中为我工作:我在我的类中添加了另一个属性,该属性根据MyBool的值返回一个字符串。 请注意,在我的情况下,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}">