WPF 绑定 - 空字符串的默认值

Posted

技术标签:

【中文标题】WPF 绑定 - 空字符串的默认值【英文标题】:WPF Binding - Default value for empty string 【发布时间】:2013-03-12 03:31:47 【问题描述】:

如果绑定字符串为空,是否有标准方法可以为 WPF 绑定设置默认值或回退值?

<TextBlock Text="Binding Name, FallbackValue='Unnamed'" />

FallbackValue 似乎只在Name 为空时才生效,但在设置为String.Empty 时不会生效。

【问题讨论】:

[在此处输入链接描述][1] [1] 有一个非常简单的答案:***.com/questions/16612622/… 在 [TextBox Default Value if Binding 返回 null][1] [1] 有一个非常简单的解决方案:***.com/questions/16612622/… 【参考方案1】:

DataTrigger 是我这样做的方式:

<TextBox>
  <TextBox.Style>
        <Style TargetType="x:Type TextBox"  BasedOn="StaticResource ReadOnlyTextBox">
            <Setter Property="Text" Value="Binding Name"/>
            <Style.Triggers>
                <DataTrigger Binding="Binding Path=Name.Length, FallbackValue=0, TargetNullValue=0" Value="0">
                    <Setter Property="Text" Value="x:Static local:ApplicationLabels.NoValueMessage"/>
                </DataTrigger>
            </Style.Triggers>
        </Style>
    </TextBox.Style>
</TextBox>

【讨论】:

我喜欢这种方法,因为它让我可以将默认值绑定到我的 ViewModel 中的另一个属性。谢谢:) 你也可以用Name 和空字符串代替Name.length,非常喜欢这种方法:) 看到Name 通常是string,那么Name.Length 将是Int32 类型。出于这个原因,不需要指定TargetNullValue,因为表达式永远不会计算为null,因为它完全可以计算。 FallbackValue 是这里最重要的属性。 丑陋的方式来做到这一点......对于这样一个简单的事情应该是 1 班轮。【参考方案2】:

我的印象是FallbackValue在绑定失败时提供一个值,而TargetNullValue在绑定值为空时提供一个值。

要执行您想要的操作,您需要一个转换器(可能带有参数)将空字符串转换为目标值,或者将逻辑放入您的视图模型中。

我可能会使用类似这样的转换器(未经测试)。

public class EmptyStringConverter : MarkupExtension, IValueConverter
  
    public object Convert(object value, Type targetType, 
                          object parameter, CultureInfo culture)
    
        return string.IsNullOrEmpty(value as string) ? parameter : value;
    

    public object ConvertBack(object value, Type targetType, 
                              object parameter, CultureInfo culture)
    
        throw new NotImplementedException();
    

    public override object ProvideValue(IServiceProvider serviceProvider)
    
        return this;
    

【讨论】:

【参考方案3】:

你应该为此创建一个转换器,它实现了IValueConverter

public class StringEmptyConverter : IValueConverter 

public object Convert(object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      return string.IsNullOrEmpty((string)value) ? parameter : value;
    

public object ConvertBack(
      object value, Type targetType, object parameter, System.Globalization.CultureInfo culture) 
      throw new NotSupportedException();
    


然后在 xaml 中,您只需将转换器提供给绑定,(xxx 仅代表您的 Window / UserControl / Style ... 绑定所在的位置)

<xxx.Resources>
<local:StringEmptyConverter x:Key="StringEmptyConverter" />
</xxx.Resources>
<TextBlock Text="Binding Name, Converter=StaticResource StringEmptyConverter, ConverterParameter='Placeholder Text'" />

【讨论】:

我需要为每个绑定指定不同的默认字符串,但我可以将字符串作为 ConverterParameter 传递。 @Viv 为什么绑定到 Name 属性,而不是 Text? @Andrzej huh Name 是 OP 在他的问题中提到的属性。【参考方案4】:

您可以使用转换器并对其进行相应的验证。

Binding="Binding Path=Name, Converter=StaticResource nameToOtherNameConverter"

在你的转换器中

public object Convert(object value, Type targetType, object parameter, CultureInfo culture)
    
        if (!string.IsNullOrEmpty(value.ToString()))
         /*do something and return your new value*/ 

【讨论】:

以上是关于WPF 绑定 - 空字符串的默认值的主要内容,如果未能解决你的问题,请参考以下文章

如何设置TextBox空字符串的默认值而不是null

WPF——TargetNullValue(如何在绑定空值显示默认字符)

如何使用 Access VBA 将具有默认值的未绑定文本框的值设置为空字符串

为 HSQLDB 中的列指定默认空字符串的正确方法?

去除数组里面值为空或者为空字符串的元素

MySQL中如何排除null和空字符串的条件