代码之家  ›  专栏  ›  技术社区  ›  John Myczek

wpf:将bool值显示为“是”/“否”

  •  41
  • John Myczek  · 技术社区  · 16 年前

    我有一个bool值,需要在文本块中显示为“是”或“否”。我尝试使用StringFormat来完成此操作,但我的StringFormat被忽略,并且TextBlock显示“true”或“false”。

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

    我的语法是否有问题,或者不支持这种类型的StringFormat?

    我知道我可以使用ValueConverter来实现这一点,但是StringFormat解决方案看起来更优雅(如果可行的话)。

    7 回复  |  直到 8 年前
        1
  •  43
  •   Thomas Levesque    16 年前

    使用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
  •  57
  •   alf    13 年前

    您也可以使用 this great value converter

    然后在XAML中声明如下内容:

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

    你可以这样使用它:

    <TextBlock Text="{Binding Path=MyBoolValue, Converter={StaticResource BooleanToStringConverter}}" />
    
        3
  •  29
  •   Kelly Elton    8 年前

    不带转换器

                <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>
    
        4
  •  3
  •   Simon    9 年前

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

    在我的数据报中,我只有:

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

    要使用它,只需通过github添加calcbinding,而不必在usercontrol/windows声明中添加

    <Windows XXXXX xmlns:conv="clr-namespace:CalcBinding;assembly=CalcBinding"/>
    
        5
  •  2
  •   Tim Pohlmann    8 年前

    这是一个使用 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="." />
    
        6
  •  1
  •   Kwex    10 年前

    这是另一个具有“硬编码”是/否值的简化转换器。

    [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" />
    
        7
  •  0
  •   MGDsoft    9 年前

    以下在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}">